今天遇到另一個 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 ,
所以求快直接使用這種方法比較簡單... 囧

參考資料:

修改方法

  • 修改前
    byte[] b2 = new byte[b.length]; for (int i = 0; i < b.length; i++) { b2[i] = (byte) (b[i] + k); } return b2;
  • 修改後(利用 buffer 來改)
abc