首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

解析 java.lang.Runtime:J2ME 單例模式、記憶體查詢與無進程模型

     編輯:J2ME

原始碼節錄 (CLDC 1.1 參考實作)

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    public static Runtime getRuntime() {
        return currentRuntime;
    }

    private Runtime() {}

    public void exit(int status) {
        throw new SecurityException(
            "MIDP lifecycle does not support system exit.");
    }

    public native long freeMemory();
    public native long totalMemory();
    public native void gc();
}

三大核心洞察

1. 極簡單例模式

  • private static Runtime currentRuntime = new Runtime(); 類載入時即建立唯一實例。
  • private Runtime() 禁止外部實例化。
  • getRuntime() 全域存取點,無雙重檢查鎖、無同步開銷 (類載入天然線程安全)。
  • 這是「餓漢式」單例的教科書級範例。

2. 記憶體管理唯一介面

方法含義J2ME 實務用途
freeMemory()當前可用堆位元組數載入大資源前檢查、決定是否執行 gc()、記憶體洩漏監控
totalMemory()JVM 當前向 OS 申請的總堆大小觀察堆擴張行為、估算剩餘擴張空間
gc()請求垃圾回收 (非強制)場景切換前主動調用、大物件釋放後嘗試回收

注意:CLDC 無 maxMemory(),最大堆大小由裝置廠商固定 (通常 200KB~2MB),不可動態調整。

3. exit() 拋出 SecurityException:揭示「無進程模型」

public void exit(int status) {
    throw new SecurityException("MIDP lifecycle does not support system exit.");
}

這行代碼揭示了 J2ME 與桌面/伺服器 Java 的根本架構差異:

特性Java SE (桌面/伺服器)Java ME (MIDP/CLDC)
進程概念有,JVM = 一個 OS 進程無,MIDlet = 容器內組件
啟動方式java MainClass 新建進程AMS (Application Management System) 在現有 JVM 中載入類、呼叫 startApp()
退出方式System.exit() / Runtime.exit() 終止進程調用 notifyDestroyed() 通知 AMS,AMS 回收資源、呼叫 destroyApp()
多任務多進程/多線程單一 JVM 同一時間只跑一個 MIDlet (MIDP 2.0 允許後台但受限)
類載入隔離ClassLoader 隔離無自訂 ClassLoader,所有 MIDlet 共享同一 Bootstrap ClassLoader

存儲架構補充:ROM + RAM 雙分區

  • ROM (Flash/EEPROM):持久化儲存,存放 MIDlet Suite (.jar/.jad)、系統軟體、預裝應用。掉電不丟失。
  • RAM:運行時記憶體,存放堆、棧、類元資料、解壓後的類字節碼。啟動 MIDlet 時,AMS 從 ROM 讀取 JAR、驗證、載入到 RAM。
  • 無磁碟、無檔案系統 (除 RMS/文件連接可選 API),System.exit() 無意義,因為沒有「進程」可終結。

生命週期正確模式

public class MyMidlet extends MIDlet {
    public void startApp() {
        // 初始化 UI、資源、網路
    }
    public void pauseApp() {
        // 釋放非必要資源、暫停執行緒
    }
    public void destroyApp(boolean unconditional) {
        // 釋放所有資源、關閉連線、存檔
        if (unconditional || canSaveState()) {
            notifyDestroyed(); // 告訴 AMS 我已準備好被銷毀
        } else {
            throw new MIDletStateChangeException("User cancelled exit");
        }
    }
}

永遠不要在 MIDlet 中呼叫 Runtime.getRuntime().exit(),只會得到 SecurityException 且無法優雅退出。

結語

java.lang.Runtime 在 J2ME 中被精簡為「單例門面 + 記憶體查詢 + GC 請求」,其 exit() 方法直接拋出異常,強制開發者面對「無進程、AMS 托管生命週期」的嵌入式現實。理解這一點,是從桌面 Java 思維轉型為行動/嵌入式 Java 思維的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved