モジュール 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インタフェースで指定されます。

メモリー使用量監視メカニズムは、ロード・バランシングまたは作業負荷分散に使用することを目的としています。 たとえば、アプリケーションは、メモリー使用が一定のしきい値を超えたときに、新しい作業負荷の受け入れを停止します。 メモリー使用量監視メカニズムは、アプリケーションのためにメモリー不足条件を検出したり、メモリー不足条件から回復したりするためのものではありません。

通知

このMemoryMXBeanは、メモリー・プールのいずれかの1つが「使用しきい値」または「コレクションの使用しきい値」をサポートしている場合に2つのタイプのメモリーnotificationsを発行するNotificationEmitterです。これは、MemoryPoolMXBean.isUsageThresholdSupported()およびMemoryPoolMXBean.isCollectionUsageThresholdSupported()メソッドをコールして決定できます。

発行される通知は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
関連項目:
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    void
    gc()
    ガベージ・コレクタを実行します。
    オブジェクトの割当てに使用されるヒープの現在のメモリー使用量を返します。
    Java仮想マシンによって使用されるヒープ以外の現在のメモリー使用量を返します。
    int
    非推奨。
    最終決定は削除のために非推奨になりました。
    boolean
    メモリー・システムの詳細出力が有効かどうかをテストします。
    void
    setVerbose(boolean value)
    メモリー・システムの詳細出力を有効または無効にします。

    インタフェースjava.lang.management.PlatformManagedObjectで宣言されたメソッド

    getObjectName
  • メソッドの詳細

    • getObjectPendingFinalizationCount

      @Deprecated(since="18") int getObjectPendingFinalizationCount()
      非推奨。
      最終決定は削除のために非推奨になりました。 詳細については、Object.finalize()を参照してください。
      ファイナライズを中断しているオブジェクトのおよその数を返します。
      戻り値:
      ファイナライズを中断しているオブジェクトのおよその数 このMemoryMXBeanに、ファイナライズが無効または削除されたJVMに関する情報が含まれている場合、このメソッドは常にゼロを返します。
    • 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()
       
      関連項目: