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;
// 後續需載入 3.png、4.png,必須使用 pic3、pic4
if (pic3 == null) pic3 = Image.createImage("/3.png"); // 正確
if (pic1 == null) pic1 = Image.createImage("/3.png"); // 錯誤!干擾 GC 回收 pic1 原物件
重複使用變數會讓原物件失去參考但 GC 難以即時辨識,導致記憶體殘留。
釋放模式:
if (sound != null) {
sound.stop(); // 必須先停止
sound = null;
}
播放模式:
if (sound != null) {
sound.stop(); // 先確保停止,避免產生無法回收物件
sound.start();
}
不同平台對聲音實作不同,未停止直接播放可能產生孤立物件造成洩漏。
try-finally 確保釋放執行。System.gc() 輔助回收(非強制)。