モジュール java.management
パッケージ java.lang.management

インタフェースMemoryMXBean

  • すべてのスーパー・インタフェース:
    PlatformManagedObject

    public interface MemoryMXBean
    extends PlatformManagedObject
    Java仮想マシンのメモリー・システムの管理インタフェースです。

    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です。

    発行される通知は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にアクセスする方法
    • メソッドの詳細

      • getObjectPendingFinalizationCount

        int getObjectPendingFinalizationCount()
        ファイナライズを中断しているオブジェクトのおよその数を返します。
        戻り値:
        ファイナライズを中断しているオブジェクトのおよその数
      • getHeapMemoryUsage

        MemoryUsage getHeapMemoryUsage()
        オブジェクトの割当てに使用されるヒープの現在のメモリー使用量を返します。 ヒープは、1つ以上のメモリー・プールで構成されています。 返されたメモリー使用量のusedcommittedのサイズはすべてのヒープ・メモリー・プールのメモリー使用量の合計、initmaxのサイズはヒープ・メモリーの設定(すべてのヒープ・メモリー・プールの合計と同じとは限らない)を表します。

        返されたメモリー使用量における使用されたメモリーの量は、ライブ・オブジェクトと収集されなかったガベージ・オブジェクト(存在する場合)の両方により占有されたメモリーの量です。

        MBeanServerアクセス:
        MemoryUsageのマップ型は、MemoryUsageで指定された属性を含むCompositeDataです。

        戻り値:
        ヒープ・メモリー使用量を表すMemoryUsageオブジェクト。
      • getNonHeapMemoryUsage

        MemoryUsage getNonHeapMemoryUsage()
        Java仮想マシンによって使用されるヒープ以外の現在のメモリー使用量を返します。 ヒープ以外のメモリーは、1つ以上のメモリー・プールで構成されています。 返されたメモリー使用量のusedcommittedのサイズはヒープ以外のメモリー・プールすべてのメモリー使用量の合計、initmaxのサイズはヒープ以外のメモリーの設定(ヒープ以外のメモリー・プールすべての合計と同じとは限らない)を表します。

        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()