J2ME 若處理不當資源建立/釋放,會出現類似 C/C++ 的記憶體洩漏:可用記憶體越來越少。最常用資源為圖片與聲音。
每個圖片資源對應一個專屬變數,勿重複使用變數載入不同圖片。
// 正確:各圖片獨立變數
Image pic1, pic2, pic3, pic4;
if (pic1 == null) pic1 = Image.createImage("/1.png");
if (pic2 == null) pic2 = Image.createImage("/2.png");
// 用畢釋放
pic1 = null; pic2 = null;
// 需要新圖片時,用新變數
if (pic3 == null) pic3 = Image.createImage("/3.png");
// 錯誤:重用變數載入新圖片
if (pic1 == null) pic1 = Image.createImage("/3.png"); // 干擾 GC 回收 pic1 原物件
重用變數會讓 GC 難以判斷原物件是否仍被引用,導致回收不乾淨。
sound.stop(); sound = null;if (sound != null) { sound.stop(); sound.start(); } 避免重複播放產生無法回收物件。不同平台對聲音處理方式不同(參考 dba8.cn、Oracle-bbs),實作時需針對目標平台測試調整。
嚴格遵循「一資源一變數、用畢歸零、播放前停止」三原則,可有效避免 Java ME 記憶體洩漏,穩定長時間運行。