JavaTM 2 Platform
Standard Ed. 5.0

java.lang.management
インタフェース MemoryMXBean


public interface MemoryMXBean

Java 仮想マシンのメモリシステムの管理インタフェースです。

Java 仮想マシンは、このインタフェースの実装クラスの単一インスタンスを持ちます。このインタフェースを実装しているインスタンスは、ManagementFactory.getMemoryMXBean() メソッドを呼び出して取得できる、あるいは platform MBeanServer メソッドから取得できる MXBean です。

MBeanServer 内でメモリシステムの MXBean を一意に識別するための ObjectName は以下のとおりです。

java.lang:type=Memory

メモリ

Java 仮想マシンのメモリシステムは、以下の種類のメモリを管理します。

1. ヒープ

Java 仮想マシンには、実行時データ領域である「ヒープ」があります。このデータ領域から、すべてのクラスインスタンスと配列のメモリが割り当てられます。「ヒープ」は、Java 仮想マシンの起動時に作成されます。オブジェクトのヒープメモリは、「ガベージコレクタ」という自動メモリ管理システムにより再生されます。

ヒープは、固定サイズとすることも、拡張または縮小することもできます。ヒープのメモリは連続している必要はありません。

2. ヒープ以外のメモリ

Java 仮想マシンは、ヒープとは別のメモリ (「ヒープ以外のメモリ」という) を管理します。

Java 仮想マシンには、すべてのスレッド間で共有される「メソッド領域」があります。メソッド領域は、ヒープ以外のメモリに属します。メソッド領域は、実行時定数プール、フィールドデータやメソッドデータ、メソッドとコンストラクタのコードなど、クラスごとの構造を格納します。メソッド領域は、Java 仮想マシンの起動時に作成されます。

メソッド領域は、論理的にはヒープの一部ですが、仮想マシンの実装では、ガベージコレクトしないようにしたり、コンパクト化したりすることを選択できます。ヒープと同様に、メソッド領域は固定サイズとしたり、拡張または縮小したりすることができます。メソッド領域のメモリは連続している必要はありません。

メソッド領域のほかに、Java 仮想マシンの実装では、内部処理や最適化のためのメモリを必要としますが、このメモリもヒープ以外のメモリに属します。たとえば、JIT コンパイラでは、高性能を実現するうえで Java 仮想マシンコードから変換されたネイティブ機械コードのメモリが必要です。

メモリプールとメモリマネージャ

メモリプールメモリマネージャは、Java 仮想マシンのメモリシステムを監視および管理する抽象エンティティです。

メモリプールは、Java 仮想マシンが管理するメモリ領域を表します。Java 仮想マシンは、少なくとも 1 つのメモリプールを持ち、実行中にメモリプールを作成または削除できます。メモリプールは、ヒープまたはヒープ以外のメモリに属することができます。

メモリマネージャは、1 つ以上のメモリプールの管理を担当します。ガベージコレクタは、到達できないオブジェクトにより占有されたメモリの再生を担当するメモリマネージャの 1 種です。Java 仮想マシンは、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
関連項目:
JMX Specification, Ways to Access MXBeans

メソッドの概要
 void gc()
          ガベージコレクタを実行します。
 MemoryUsage getHeapMemoryUsage()
          オブジェクトの割り当てに使用されるヒープの現在のメモリ使用量を返します。
 MemoryUsage getNonHeapMemoryUsage()
          Java 仮想マシンによって使用されるヒープ以外の現在のメモリ使用量を返します。
 int getObjectPendingFinalizationCount()
          ファイナライズを中断しているオブジェクトのおよその数を返します。
 boolean isVerbose()
          メモリシステムの詳細出力が有効かどうかをテストします。
 void setVerbose(boolean value)
          メモリシステムの詳細出力を有効または無効にします。
 

メソッドの詳細

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

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。