JavaTM 2 Platform
Standard Ed. 6

java.lang.management
介面 MemoryMXBean


public interface MemoryMXBean

Java 虛擬機器記憶體系統的管理介面。

Java 虛擬機器具有此介面的實作類別的單一實例。實作此介面的實例是一個 MXBean,可以通過調用 ManagementFactory.getMemoryMXBean() 方法或從平臺 MBeanServer 方法獲得。

在 MBeanServer 中唯一標識記憶體系統的 MXBean 的 ObjectName 為:

java.lang:type=Memory

記憶體

Java 虛擬機器的記憶體系統管理以下型別的記憶體:

1. 堆積(heap)空間

Java 虛擬機器具有一個堆積(heap)空間,堆積(heap)空間是運行時資料區域,全部類別實例和陣列的記憶體均從此處分派。堆積(heap)空間是在 Java 虛擬機器啟動時創建的。物件的堆積(heap)空間記憶體由稱為垃圾回收器 的自動記憶體管理系統回收。

堆積(heap)空間的大小可以固定,也可以擴大和縮小。堆積(heap)空間的記憶體不需要是連續空間。

2. 非堆積(heap)空間記憶體

Java 虛擬機器管理堆積(heap)空間之外的記憶體(稱為非堆積(heap)空間記憶體)。

Java 虛擬機器具有一個由所有執行緒共享的方法區。方法區屬於非堆積(heap)空間記憶體。它存儲每個類別結構,如運行時常數池、欄位和方法資料,以及方法和建構子的程式碼。它是在 Java 虛擬機器啟動時創建的。

方法區在邏輯上是堆積(heap)空間的一部分,但 Java 虛擬機器實作可以選擇不對其進行回收或壓縮。與堆積(heap)空間類似,方法區的大小可以固定,也可以擴大和縮小。方法區的記憶體不需要是連續空間。

除了方法區外,Java 虛擬機器實作可能需要用於內部處理或優化的記憶體,這種記憶體也是非堆積(heap)空間記憶體。例如,JIT 編譯器需要記憶體來存儲從 Java 虛擬機器程式碼轉換而來的本機程式碼,從而獲得高性能。

記憶體池和記憶體管理器

記憶體池記憶體管理器都是抽象實體,對 Java 虛擬機器的記憶體系統進行監視和管理。

記憶體池表示 Java 虛擬機器管理的記憶體區域。Java 虛擬機器至少有一個記憶體池,而且可以在執行期間創建或刪除記憶體池。記憶體池可以是堆積(heap)空間記憶體,也可以是非堆積(heap)空間記憶體。

記憶體管理器負責管理一個或多個記憶體池。垃圾回收器就是一種記憶體管理器,負責回收不可到達物件佔用的記憶體。Java 虛擬機器可以有一個或多個記憶體管理器。可以在運行期間添加或刪除記憶體管理器。一個記憶體池可以由多個記憶體管理器進行管理。

記憶體使用量監視

對於記憶體系統而言,記憶體使用量是一個非常重要的監視屬性。例如,記憶體使用量可以指示:

可以採用三種方式監視記憶體使用量:

具體細節在 MemoryPoolMXBean 介面中指定。

記憶體使用量監視機制旨在用於負載平衡或工作負載分佈。例如,應用程序在其記憶體使用量超過特定閾值時,將會停止接收任何新的工作負載。它不適合用於供應用程序進行檢測並從低記憶體情況恢復。

通知

MemoryMXBean 是一個 NotificationEmitter,如果任何一個記憶體池支持使用量閾值集合使用量閾值(可以通過調用 MemoryPoolMXBean.isUsageThresholdSupported()MemoryPoolMXBean.isCollectionUsageThresholdSupported() 方法確定),它將發出兩種型別的通知

發出的通知是一個 Notification 實例,其使用者資料設置為 CompositeData(表示包含建構該通知時記憶體池資訊的 MemoryNotificationInfo 物件)。CompositeData 套件含 MemoryNotificationInfo 中描述的各個屬性。


NotificationEmitter

ManagementFactory.getMemoryMXBean() 返回的 MemoryMXBean 物件實作了 NotificationEmitter 介面,該介面允許在 MemoryMXBean 中將偵聽器註冊為通知偵聽器。 以下範例程式碼將註冊 MyListener 以處理 MemoryMXBean 發出的通知。
 class MyListener implements javax.management.NotificationListener {
     public void handleNotification(Notification notif, Object handback) {
         // handle notification
         ....
     }
 }

 MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
 NotificationEmitter emitter = (NotificationEmitter) mbean;
 MyListener listener = new MyListener();
 emitter.addNotificationListener(listener, null, null);
 

從以下版本開始:
1.5
另請參見:
JMX Specification., Ways to Access MXBeans

方法摘要
 void gc()
          運行垃圾回收器。
 MemoryUsage getHeapMemoryUsage()
          返回用於物件分派的堆積(heap)空間的當前記憶體使用量。
 MemoryUsage getNonHeapMemoryUsage()
          返回 Java 虛擬機器使用的非堆積(heap)空間記憶體的當前記憶體使用量。
 int getObjectPendingFinalizationCount()
          返回其終止被掛起的物件的近似數目。
 boolean isVerbose()
          測試記憶體系統的 verbose 輸出是否已啟用。
 void setVerbose(boolean value)
          啟用或禁用記憶體系統的 verbose 輸出。
 

方法詳細資訊

getObjectPendingFinalizationCount

int getObjectPendingFinalizationCount()
返回其終止被掛起的物件的近似數目。

返回:
其終止被掛起的物件的近似數目。

getHeapMemoryUsage

MemoryUsage getHeapMemoryUsage()
返回用於物件分派的堆積(heap)空間的當前記憶體使用量。堆積(heap)空間由一個或多個記憶體池組成。返回的記憶體使用量中的已使用大小和已提交大小為所有堆積(heap)空間記憶體池的對應值的總和,而返回的記憶體使用量中表示堆積(heap)空間記憶體設置的初始大小和最大大小則可能不等於所有堆積(heap)空間記憶體池對應值的總和。

返回的記憶體使用量中已使用記憶體量為活動物件和尚未回收的垃圾物件(如果有)所佔用記憶體的總量。

MBeanServer 存取
MemoryUsage 的映射型別為 CompositeData,具有 MemoryUsage 中指定的屬性。

返回:
表示堆積(heap)空間記憶體使用量的 MemoryUsage 物件。

getNonHeapMemoryUsage

MemoryUsage getNonHeapMemoryUsage()
返回 Java 虛擬機器使用的非堆積(heap)空間記憶體的當前記憶體使用量。非堆積(heap)空間記憶體由一個或多個記憶體池組成。返回的記憶體使用量中的已使用大小和已提交大小為所有非堆積(heap)空間記憶體池的對應值的總和,而返回的記憶體使用量中表示非堆積(heap)空間記憶體設置的初始大小和最大大小則可能不等於所有非堆積(heap)空間記憶體池對應值的總和。

MBeanServer 存取
MemoryUsage 的映射型別為 CompositeData,具有 MemoryUsage 中指定的屬性。

返回:
表示非堆積(heap)空間記憶體使用量的 MemoryUsage 物件。

isVerbose

boolean isVerbose()
測試記憶體系統的 verbose 輸出是否已啟用。

返回:
如果啟用了記憶體系統的 verbose 輸出,則返回 true;否則返回 false

setVerbose

void setVerbose(boolean value)
啟用或禁用記憶體系統的 verbose 輸出。verbose 輸出資訊和 verbose 資訊發送到的輸出串流都與實作有關。通常,只要垃圾回收時釋放了記憶體,Java 虛擬機器實作就會輸出一條訊息。

此方法的每次調用都會全體啟用或禁用 verbose 輸出。

參數:
value - 為 true 將啟用 verbose 輸出;為 false 將禁用輸出。
拋出:
SecurityException - 如果存在安全管理器,且調用方不具有 ManagementPermission("control")。

gc

void gc()
運行垃圾回收器。調用 gc() 實際上等同於調用:
 System.gc()
 

另請參見:
System.gc()

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only