OutOfMemoryError Occurs when allocate a big Byte Array
Posted on February 6th, 2015
今天遇到另一個 Java 的地雷,
而且一個非常簡單的一個程式碼就會吐出 OOM 錯誤:
java.lang.OutOfMemoryError: Java heap space
int fileLength = 170 * 1024 * 1024;
byte[] b2 = new byte[fileLength];
Array 不能且不應該產生這麼長的 instance, 因為會超過 java 的 default heap size.
當然可以去改 jvm 參數將 heap size 加大,
但這並不是一個長遠之計,
改天再遇到更大的檔案一樣會 OOM
這次因為想要打亂檔案的 header ,
所以求快直接使用這種方法比較簡單... 囧
參考資料:
- 參考了 stackoverflow, 有人回答道: 若遇上這樣的問題, 應該要 partial 去處理.
- http://stackoverflow.com/questions/8652073/java-heap-space-error-while-reading-file-in-byte-array
修改方法
- 修改前
byte[] b2 = new byte[b.length]; for (int i = 0; i < b.length; i++) { b2[i] = (byte) (b[i] + k); } return b2;
- 修改後(利用 buffer 來改)
abc