早期功能機 (Nokia 7210, 6600, S40 系列) Heap 僅 200~500 KB。OutOfMemoryError 是遊戲開發頭號殺手,尤其「老 40」(Nokia 3410/7210 等 4096 色機型) 更是移植噩夢。
System.out.println("Free: " + Runtime.getRuntime().freeMemory()); 關鍵節點埋點 (啟動後、載入資源前後、幀循環)。try-catch (保留關鍵)、刪除調試日誌、縮短標識符 (ProGuard 自動處理)、合併常量字串。getResourceAsStream() 按需載入,用完 null 掉。Heap Bytes = Width × Height × BytesPerPixel
誤區:PNG 壓縮只減小 JAR,**不減少解碼後 Heap 佔用**。
oldImg = null; System.gc(); loadNew();。Manager.createPlayer() 瞬間分配大量緩衝區。Player.prefetch() 預載,播放完 close() 釋放。以下操作會產生**短時巨大峰值**,若剩餘 Heap 不足直接 OOM:
Image.createImage(stream/name) — 解碼緩衝 + 位圖。Manager.createPlayer(stream) — 解碼器緩衝。RecordStore.openRecordStore() — 索引構建、快照。Class.forName() / new Class() — 類載入、驗證。對策:
System.gc() → 載入音頻 → System.gc() → 打開 RMS。System.gc():在確定臨時對象不可達後調用,**不可濫用** (會觸發 Full GC 卡頓)。LevelResourcePack 每關專屬資源清單,進關載入、出關釋放。雖然 J2ME 年代已遠,但受限環境下的記憶體工程思維 完全適用於:IoT 設備 (FreeRTOS/Zephyr + Java ME Embedded)、Android 低端機優化、GraalVM Native Image 體積控制、WebAssembly 模組大小優化。