System.out.println(Runtime.getRuntime().freeMemory());
集成到遊戲引擎循環中,實時捕獲剩餘內存,定位峰值位置,無性能損耗、數據真實。作者曾無數次靠此在 Nokia 40 系列上尋找 OOM 臨界點。
所有類在 MIDlet 啟動時一次性全部加載進內存。影響因素:
驗證技巧:在 MIDlet 構造函數調用 Runtime.freeMemory() 獲取啟動後基線佔用。
try-catch、縮短變量名、刪除日誌、合併同類方法,極限壓縮字節碼體積 (僅針對 40 系列等極端設備).dat/.txt),運行時按需 getResourceAsStream() 加載,用完置 null + System.gc()getResourceAsStream)、RMS (openRecordStore)、音頻 (Manager.createPlayer)、圖片 (Image.createImage) 會產生短時巨大內存尖峰。對策:錯峰調用、分步加載、調用間插入 System.gc()、Runtime 監控定位峰值位置內存 (Bytes) = 寬 × 高 × 每像素字節數
每像素字節數由設備色深決定:
關鍵誤區:壓縮圖片 (PNG/JPG) 無法減少內存佔用,解碼後內存佔用僅取決於寬高色深。壓縮只減小 JAR 體積。
| 策略 | 核心思想 | 典型手段 | 案例 |
|---|---|---|---|
| 靜態優化 | 減小單圖寬高/總面積 | 圖塊複用 (肢體分割重組)、緊湊圖集、動畫幀複用、去除透明邊框 | Gameloft《波斯王子》人物分割重組,極致利用像素 |
| 動態優化 | 減少同一時刻駐留內存的圖片數 | 分關卡/場景加載、引用計數卸載、LRU 緩存、預加載/預卸載 | 《火影武士》6種怪物分關加載,每關僅載入2-3種 |
MIDI 文件加載時音軌數據轉為字節流佔用內存。優化方向:
ByteArrayInputStream 創建 Player,精確控制內存佔用freeMemory(),超過設備 60% 即報警System.gc()null、調用 flushGraphics()、取消定時器finalize() 不可靠,顯式 dispose() 模式管理資源生命週期J2ME 內存優化是工程權衡藝術:在極受限環境 (200KB) 中運行完整遊戲,需要「靜態精簡 + 動態管理 + 峰值規避」三位一體。核心心法:內存不在大,用得巧則靈。掌握 Runtime.freeMemory() 實時監控 + 圖片佔用公式 + 動態加載策略,即可攻克絕大多數 OOM 難題。