- すべてのスーパー・インタフェース:
PlatformManagedObject
Java仮想マシンは、このインタフェースの実装クラスの単一インスタンスを持ちます。 このインタフェースを実装するこのインスタンスは、ManagementFactory.getMemoryMXBean()
メソッドまたはplatform MBeanServer
メソッドを呼び出すことによって取得できるMXBeanです。
MBeanServer内でメモリー・システムのMXBeanを一意に識別するためのObjectName
は次のとおりです。
java.lang:type=Memory
これを取得するには、PlatformManagedObject.getObjectName()
メソッドを呼び出します。
メモリー
Java仮想マシンのメモリー・システムは、次の種類のメモリーを管理します。1. ヒープ
Java仮想マシンに含まれるヒープは実行時データ領域であり、ここからすべてのクラス・インスタンスと配列のメモリーが割り当てられます。 メソッド領域は、Java仮想マシンの起動時に作成されます。 オブジェクトのヒープ・メモリーは、ガベージ・コレクタという自動メモリー管理システムにより再生されます。ヒープは、固定サイズとすることも、拡張または縮小することもできます。 ヒープのメモリーは連続している必要はありません。
2. ヒープ以外のメモリー
Java仮想マシンは、「ヒープ以外のメモリー」(非ヒープ・メモリーと呼ばれる)を管理します。Java仮想マシンには、すべてのスレッド間で共有されるメソッド領域があります。 メソッド領域は、ヒープ以外のメモリーに属します。 非ヒープ・メモリーには、実行定数プール、フィールドおよびメソッド・データ、メソッドおよびコンストラクタのコードなど、クラス単位の構造体が格納されます。 メソッド領域は、Java仮想マシンの起動時に作成されます。
メソッド領域は、論理的にはヒープの一部ですが、仮想マシンの実装では、ガベージ・コレクトしないようにしたり、コンパクト化したりすることを選択できます。 ヒープと同様に、メソッド領域は固定サイズとしたり、拡張または縮小したりすることができます。 メソッド領域のメモリーは連続している必要はありません。
メソッド領域のほかに、Java仮想マシンの実装では、内部処理や最適化のためのメモリーを必要としますが、このメモリーもヒープ以外のメモリーに属します。 たとえば、JITコンパイラでは、高性能を実現するうえでJava仮想マシン・コードから変換されたネイティブ機械コードのメモリーが必要です。
メモリー・プールとメモリー・マネージャ
メモリー・プール
とメモリー・マネージャ
は、Java仮想マシンのメモリー・システムを監視および管理する抽象エンティティです。
メモリー・プールは、Java仮想マシンが管理するメモリー領域を表します。 Java仮想マシンは、少なくとも1つのメモリー・プールを持ち、実行中にメモリー・プールを作成または削除できます。 メモリー・プールは、ヒープまたはヒープ以外のメモリーに属することができます。
メモリー・マネージャは、1つ以上のメモリー・プールの管理を担当します。 ガベージ・コレクタは、到達できないオブジェクトにより占有されたメモリーの再生を担当するメモリー・マネージャの1種です。 Java仮想マシンは、1つ以上のメモリー・マネージャを持つことができます。 実行中にメモリー・マネージャを追加または削除できます。 メモリー・プールは、複数のメモリー・マネージャによって管理できます。
メモリー使用量の監視
メモリー使用量は、メモリー・システムにとってきわめて重要な監視属性です。 たとえば、メモリー使用量は次を示します。- アプリケーションのメモリー使用量
- 自動メモリー管理システムにかかっている作業負荷
- 可能性のあるメモリー・リーク
メモリー使用量は、次の3つの方法で監視できます。
- ポーリング
- 使用量しきい値通知
- コレクション使用量しきい値通知
MemoryPoolMXBean
インタフェースで指定されます。
メモリー使用量監視メカニズムは、ロード・バランシングまたは作業負荷分散に使用することを目的としています。 たとえば、アプリケーションは、メモリー使用が一定のしきい値を超えたときに、新しい作業負荷の受け入れを停止します。 メモリー使用量監視メカニズムは、アプリケーションのためにメモリー不足条件を検出したり、メモリー不足条件から回復したりするためのものではありません。
通知
MemoryPoolMXBean.isUsageThresholdSupported()
メソッドおよびMemoryPoolMXBean.isCollectionUsageThresholdSupported()
メソッドを呼び出して判定できる使用量しきい値またはコレクション使用量しきい値をメモリー・プールの1つがサポートする場合、このMemoryMXBean
は、2種類のメモリー通知
を発行するNotificationEmitter
です。
使用量しきい値超過通知
- メモリー・プールのメモリー使用量が増加し、使用量しきい値に達したか、超えたことを通知します。コレクション使用しきい値超過通知
- Java仮想マシンがメモリー・プールで使用しないオブジェクトのリサイクルに最善を尽くしたあと、メモリー・プールのメモリー使用量がコレクション使用量しきい値以上であることを通知します。
発行される通知はNotification
インスタンスです。このインスタンスのユーザー・データ
は、通知が構築されたときのメモリー・プールに関する情報を含むMemoryNotificationInfo
オブジェクトを表すCompositeData
に設定されています。 CompositeData
は、MemoryNotificationInfo
に記述された属性を格納します。
NotificationEmitter
ManagementFactory.getMemoryMXBean()
によって返されるMemoryMXBean
オブジェクトは、リスナーを通知リスナーとしてMemoryMXBean
内で登録できるようにするNotificationEmitter
インタフェースを実装します。 次に、MemoryMXBean
によって発行された通知を処理するためのMyListener
を登録するサンプル・コードを示します。
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
- 関連項目:
ManagementFactory.getPlatformMXBeans(Class)
, JMX仕様, MXBeanにアクセスする方法
-
メソッドのサマリー
修飾子と型メソッド説明void
gc()
ガベージ・コレクタを実行します。オブジェクトの割当てに使用されるヒープの現在のメモリー使用量を返します。Java仮想マシンによって使用されるヒープ以外の現在のメモリー使用量を返します。int
ファイナライズを中断しているオブジェクトのおよその数を返します。boolean
メモリー・システムの詳細出力が有効かどうかをテストします。void
setVerbose(boolean value)
メモリー・システムの詳細出力を有効または無効にします。インタフェース java.lang.management.PlatformManagedObjectで宣言されたメソッド
getObjectName
-
メソッドの詳細
-
getObjectPendingFinalizationCount
int getObjectPendingFinalizationCount()ファイナライズを中断しているオブジェクトのおよその数を返します。- 戻り値:
- ファイナライズを中断しているオブジェクトのおよその数
-
getHeapMemoryUsage
MemoryUsage getHeapMemoryUsage()オブジェクトの割当てに使用されるヒープの現在のメモリー使用量を返します。 ヒープは、1つ以上のメモリー・プールで構成されています。 返されたメモリー使用量のused
とcommitted
のサイズはすべてのヒープ・メモリー・プールのメモリー使用量の合計、init
とmax
のサイズはヒープ・メモリーの設定(すべてのヒープ・メモリー・プールの合計と同じとは限らない)を表します。返されたメモリー使用量における使用されたメモリーの量は、ライブ・オブジェクトと収集されなかったガベージ・オブジェクト(存在する場合)の両方により占有されたメモリーの量です。
MBeanServerアクセス:
MemoryUsage
のマップ型は、MemoryUsage
で指定された属性を含むCompositeData
です。- 戻り値:
- ヒープ・メモリー使用量を表す
MemoryUsage
オブジェクト。
-
getNonHeapMemoryUsage
MemoryUsage getNonHeapMemoryUsage()Java仮想マシンによって使用されるヒープ以外の現在のメモリー使用量を返します。 ヒープ以外のメモリーは、1つ以上のメモリー・プールで構成されています。 返されたメモリー使用量のused
とcommitted
のサイズはヒープ以外のメモリー・プールすべてのメモリー使用量の合計、init
とmax
のサイズはヒープ以外のメモリーの設定(ヒープ以外のメモリー・プールすべての合計と同じとは限らない)を表します。MBeanServerアクセス:
MemoryUsage
のマップ型は、MemoryUsage
で指定された属性を含むCompositeData
です。- 戻り値:
- ヒープ以外のメモリー使用量を表す
MemoryUsage
オブジェクト。
-
isVerbose
boolean isVerbose()メモリー・システムの詳細出力が有効かどうかをテストします。- 戻り値:
- メモリー・システムの詳細出力が有効な場合は
true
、そうでない場合はfalse
。
-
setVerbose
void setVerbose(boolean value)メモリー・システムの詳細出力を有効または無効にします。 詳細出力情報と詳細情報の出力先の出力ストリームは実装に応じて異なります。 一般に、Java仮想マシンの実装はガベージ・コレクションでメモリーを解放するたびにメッセージを出力します。このメソッドの呼出しのたびに、詳細出力は大域的に有効または無効になります。
- パラメータ:
value
- 詳細出力を有効にする場合はtrue
、無効にする場合はfalse
。- 例外:
SecurityException
- セキュリティ・マネージャが存在する場合で、呼出し元がManagementPermission("control")を持たない場合。
-
gc
void gc()ガベージ・コレクタを実行します。gc()
の呼出しの動作は、実際には次の呼び出しと同じです。System.gc()
- 関連項目:
System.gc()
-