public interface MemoryMXBean extends PlatformManagedObject
Java 仮想マシンは、このインタフェースの実装クラスの単一インスタンスを持ちます。このインタフェースを実装したこのインスタンスは MXBean ですが、これを取得するには、ManagementFactory.getMemoryMXBean()
メソッドを呼び出すか、platform MBeanServer
のメソッドを使用します。
MBeanServer 内でメモリーシステムの MXBean を一意に識別するための ObjectName は次のとおりです。
java.lang:type=Memory
これを取得するには、PlatformManagedObject.getObjectName()
メソッドを呼び出します。
ヒープは、固定サイズとすることも、拡張または縮小することもできます。ヒープのメモリーは連続している必要はありません。
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
に記述された属性を格納します。
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);
ManagementFactory.getPlatformMXBeans(Class)
, JMX 仕様, MXBean にアクセスする方法修飾子と型 | メソッドと説明 |
---|---|
void |
gc()
ガベージコレクタを実行します。
|
MemoryUsage |
getHeapMemoryUsage()
オブジェクトの割り当てに使用されるヒープの現在のメモリー使用量を返します。
|
MemoryUsage |
getNonHeapMemoryUsage()
Java 仮想マシンによって使用されるヒープ以外の現在のメモリー使用量を返します。
|
int |
getObjectPendingFinalizationCount()
ファイナライズを中断しているオブジェクトのおよその数を返します。
|
boolean |
isVerbose()
メモリーシステムの詳細出力が有効かどうかをテストします。
|
void |
setVerbose(boolean value)
メモリーシステムの詳細出力を有効または無効にします。
|
getObjectName
int getObjectPendingFinalizationCount()
MemoryUsage getHeapMemoryUsage()
返されたメモリー使用量における使用されたメモリーの量は、ライブオブジェクトと収集されなかったガベージオブジェクト (存在する場合) の両方により占有されたメモリーの量です。
MBeanServer アクセス:
MemoryUsage のマップ型は、MemoryUsage
で指定された属性を含む CompositeData です。
MemoryUsage
オブジェクト。MemoryUsage getNonHeapMemoryUsage()
MBeanServer アクセス:
MemoryUsage のマップ型は、MemoryUsage
で指定された属性を含む CompositeData です。
MemoryUsage
オブジェクト。boolean isVerbose()
void setVerbose(boolean value)
このメソッドの呼び出しのたびに、詳細出力は大域的に有効または無効になります。
value
- 詳細出力を有効にする場合は true、無効にする場合は false。SecurityException
- セキュリティーマネージャーが存在する場合で、呼び出し元が ManagementPermission("control") を持たない場合。void gc()
gc()
の呼び出しの動作は、実際には次の呼び出しと同じです。
System.gc()
System.gc()
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.