public interface MemoryPoolMXBean extends PlatformManagedObject
メモリーマネージャー
により管理されます。
Java 仮想マシンは、このインタフェースの実装クラスの 1 つ以上のインスタンスを持ちます。このインタフェースを実装したインスタンスは MXBean ですが、これを取得するには、ManagementFactory.getMemoryPoolMXBeans()
メソッドを呼び出すか、platform MBeanServer
のメソッドを使用します。
MBeanServer 内でメモリープールの MXBean を一意に識別するための ObjectName は次のとおりです。
java.lang:type=MemoryPool
,name=pool's name
これを取得するには、PlatformManagedObject.getObjectName()
メソッドを呼び出します。
Java 仮想マシンは、オブジェクト割り当て用のヒープを持ち、メソッド領域と Java 仮想マシンの実行用のヒープ以外のメモリーも保持しています。Java 仮想マシンは、1 つ以上のメモリープールを保有できます。各メモリープールは次の型のどちらかのメモリー領域を表します。
getUsage()
メソッドは、メモリープールの現在の使用量の推定値を提供します。ガベージコレクトされたメモリープールの場合は、used メモリーの量にプール内のすべてのオブジェクト (到達できるオブジェクトおよび到達できないオブジェクトの両方を含む) によって占有されるメモリーが含まれます。
一般に、このメソッドは負荷の少ない操作でおよそのメモリー使用量を取得します。オブジェクトが連続してパックされない場合など、一部のメモリープールでは、このメソッドは現在のメモリー使用量を判定するのにいくらかの計算を必要とする負荷の大きい操作になる可能性があります。実装は、該当する状況をドキュメント化する必要があります。
getPeakUsage()
メソッドによって返され、resetPeakUsage()
メソッドの呼び出しによってリセットされます。
setUsageThreshold
メソッドを使って設定できます。しきい値が正の値に設定されると、このメモリープールで使用量しきい値の超過チェックが有効になります。使用量しきい値がゼロに設定されると、このメモリープールで使用量しきい値の超過チェックが無効になります。isUsageThresholdSupported()
メソッドを使えば、この機能がサポートされているかどうかを判定できます。
Java 仮想マシンは、最適な時期 (通常はガベージコレクション時) に、使用量しきい値超過チェックをメモリープールごとに実行します。各メモリープールは、メモリープール使用量がしきい値を超過していることを Java 仮想マシンが検出するたびに増加する使用量しきい値カウント
を保持しています。
この管理可能な使用量しきい値属性は、メモリー使用量の増加傾向を低いオーバーヘッドで監視するように設計されています。使用量しきい値は、一部のメモリープールに適さない場合があります。たとえば、多くの Java 仮想マシン実装で使用される共通のガベージコレクタである世代別ガベージコレクタは、年齢でオブジェクトを区分して、2 世代以上を管理します。ほとんどのオブジェクトは、もっとも若い世代 (若いメモリープール) に割り当てられます。若いメモリープールは、いっぱいになるように設計されています。 また、ガベージコレクション時にほとんどの場合到達不可能な短期間稼動のオブジェクトが収容されるため、若いメモリープールを収集すると、メモリー空間のほとんどが解放されます。このケースでは、若いメモリープールが使用量しきい値をサポートしないほうが適切です。加えて、使用量のしきい値と比較するときのオーバーヘッドは、オブジェクト割り当てのコストよりも高くつくので、1 つのメモリープールへのオブジェクトの割り当てのコストがきわめて低い場合 (例、原子ポインタ交換など)、Java 仮想マシンはメモリープールの使用量しきい値をサポートしません。
システムのメモリー使用量は、ポーリングやしきい値通知のメカニズムを使って監視できます。
アプリケーションでは、すべてのメモリープール共通の getUsage()
メソッド、または使用量しきい値をサポートするメモリープール専用の isUsageThresholdExceeded()
メソッドを呼び出すことにより、アプリケーション自体のメモリー使用量を継続的に監視できます。次に、タスクの配分と処理に特化したスレッドを持つサンプルコードの例を示します。このサンプルコードは、どの区間でもメモリー使用量に基づいて新しいタスクを受け入れて処理するかどうかを判定します。メモリー使用量が使用量しきい値を超えた場合、このサンプルコードはすべての未処理のタスクをほかの仮想マシンに再配分し、メモリー使用量が使用量しきい値以下に戻るまで新しいタスクの受け入れを停止します。
// Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); .... boolean lowMemory = false; while (true) { if (pool.isUsageThresholdExceeded()) { // potential low memory, so redistribute tasks to other VMs lowMemory = true; redistributeTasks(); // stop receiving new tasks stopReceivingTasks(); } else { if (lowMemory) { // resume receiving tasks lowMemory = false; resumeReceivingTasks(); } // processing outstanding task ... } // sleep for sometime try { Thread.sleep(sometime); } catch (InterruptedException e) { ... } }
getUsageThresholdCount()
メソッドにより返された使用量しきい値カウントを使って、返されたメモリー使用量が 2 つのポール間でしきい値以下であるかどうかを判定できます。
次に示すのは、メモリープールがメモリー不足の場合に何らかのアクションを実行し、アクション処理中にメモリー使用量の変化を無視するサンプルコードです。
// Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold which determines if // the application will take some action under low memory condition. pool.setUsageThreshold(myThreshold); int prevCrossingCount = 0; while (true) { // A busy loop to detect when the memory usage // has exceeded the threshold. while (!pool.isUsageThresholdExceeded() || pool.getUsageThresholdCount() == prevCrossingCount) { try { Thread.sleep(sometime) } catch (InterruptException e) { .... } } // Do some processing such as check for memory usage // and issue a warning .... // Gets the current threshold count. The busy loop will then // ignore any crossing of threshold happens during the processing. prevCrossingCount = pool.getUsageThresholdCount(); }
使用量しきい値通知は、MemoryMXBean
により発行されます。メモリープールのメモリー使用量が使用量しきい値に達したか超えたことを Java 仮想マシンが検出すると、仮想マシンは MemoryMXBean をトリガーして使用量しきい値超過通知
を発行します。使用量がしきい値未満になり、再び超過するまで、別の使用量しきい値超過通知は生成されません。
次のサンプルコードは、前述の最初のサンプルコードと同じロジックを実装していますが、ポーリングではなく、使用量しきい値通知メカニズムを使ってメモリー不足条件を検出しています。このサンプルコードでは、通知の受け取りにより、通知リスナーは未処理タスクの再配分、タスクの受け取りの停止、あるいは受け取りタスクの再開などの実際のアクションを実行するよう別のスレッドに通知します。handleNotification メソッドは、きわめて少量の作業を実行して遅延なしに値を返し、以降の通知の配布で遅延が生じないように設計される必要があります。時間のかかるアクションは別のスレッドにより実行される必要があります。通知リスナーは、複数のスレッドにより呼び出されることができます。 したがって、リスナーが実行するタスクは適切に同期化される必要があります。
class MyListener implements javax.management.NotificationListener { public void handleNotification(Notification notification, Object handback) { String notifType = notification.getType(); if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) { // potential low memory, notify another thread // to redistribute outstanding tasks to other VMs // and stop receiving new tasks. lowMemory = true; notifyAnotherThread(lowMemory); } } } // Register MyListener with MemoryMXBean MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); NotificationEmitter emitter = (NotificationEmitter) mbean; MyListener listener = new MyListener(); emitter.addNotificationListener(listener, null, null); // Assume this pool supports a usage threshold. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); // Usage threshold detection is enabled and notification will be // handled by MyListener. Continue for other processing. ....
MemoryMXBean がしきい値通知を発行する時期や通知が配布される時期についての保証はありません。通知リスナーが呼び出されると、メモリープールのメモリー使用量が使用量しきい値を 2 回以上超えた可能性があります。MemoryNotificationInfo.getCount()
メソッドは、通知が構築された時点でメモリー使用量が使用量しきい値を超えた回数を返します。この回数を、getUsageThresholdCount()
メソッドにより返された現在の使用量しきい値カウントと比較して、このような状況が発生したかどうかを判定できます。
MemoryMXBean
によってコレクション使用量しきい値超過通知
が発行されるように、コレクション使用量しきい値を使って、この一部のバイト数に値を設定できます。加えて、コレクション使用量しきい値カウント
が増やされます。
isCollectionUsageThresholdSupported()
メソッドを使えば、この機能がサポートされているかどうかを判定できます。
Java 仮想マシンは、コレクション使用量しきい値チェックをメモリープールごとに実行します。このチェックは、コレクション使用量しきい値が正の値に設定されている場合に有効になります。コレクション使用量しきい値がゼロに設定された場合、このチェックはこのメモリープールで無効になります。デフォルト値はゼロです。Java 仮想マシンは、ガベージコレクション時にコレクション使用量しきい値チェックを実行します。
一部のガベージコレクトされたメモリープールでは、コレクション使用量しきい値をサポートしないように選択できます。たとえば、メモリープールは連続的な並行ガベージコレクタだけにより管理されます。使用しないオブジェクトを並行ガベージコレクタが同時に再生している間に、何らかのスレッドにより、このメモリープールにオブジェクトを割り当てることができます。十分に定義されたガベージコレクション時間 (メモリー使用量をチェックするのに最適な時間) がないかぎり、コレクション使用量しきい値をサポートしてはいけません。
コレクション使用量しきい値は、Java 仮想マシンがメモリー空間の再生に最善を尽くしたあと、メモリー使用量を監視するよう設計されています。使用量しきい値で説明したポーリングおよびしきい値通知メカニズムにより、同様の方法でコレクション使用量を監視できます。
ManagementFactory.getPlatformMXBeans(Class)
, JMX 仕様, MXBean にアクセスする方法修飾子と型 | メソッドと説明 |
---|---|
MemoryUsage |
getCollectionUsage()
Java 仮想マシンがこのメモリープールで使用されないオブジェクトのリサイクルに最後に最善を尽くしたあとのメモリー使用量を返します。
|
long |
getCollectionUsageThreshold()
このメモリープールのコレクション使用量しきい値 (バイト単位) を返します。
|
long |
getCollectionUsageThresholdCount()
メモリー使用量がコレクション使用量しきい値を超えたことを Java 仮想マシンが検出した回数を返します。
|
String[] |
getMemoryManagerNames()
このメモリープールを管理しているメモリーマネージャーの名前を返します。
|
String |
getName()
このメモリープールを表す名前を返します。
|
MemoryUsage |
getPeakUsage()
Java 仮想マシンが起動されてから、またはピークがリセットされてからの、このメモリープールのピークメモリー使用量を返します。
|
MemoryType |
getType()
このメモリープールの型を返します。
|
MemoryUsage |
getUsage()
このメモリープールのメモリー使用量の評価値を返します。
|
long |
getUsageThreshold()
このメモリープールの使用量しきい値をバイト単位で返します。
|
long |
getUsageThresholdCount()
メモリー使用量がしきい値を超えた回数を返します。
|
boolean |
isCollectionUsageThresholdExceeded()
Java 仮想マシンが最善を尽くした最後のコレクションのあとに、このメモリープールのメモリー使用量がコレクション使用量しきい値に達した、または超えたかをテストします。
|
boolean |
isCollectionUsageThresholdSupported()
このメモリープールがコレクション使用量しきい値をサポートするかどうかをテストします。
|
boolean |
isUsageThresholdExceeded()
このメモリープールのメモリー使用量が使用量しきい値に達した、または超えたかどうかをテストします。
|
boolean |
isUsageThresholdSupported()
このメモリープールが使用量しきい値をサポートするかどうかをテストします。
|
boolean |
isValid()
このメモリープールが Java 仮想マシンで有効かどうかをテストします。
|
void |
resetPeakUsage()
このメモリープールのピークメモリー使用量統計を現在のメモリー使用量にリセットします。
|
void |
setCollectionUsageThreshold(long threshold)
このメモリープールのコレクション使用量しきい値を指定された threshold 値に設定します。
|
void |
setUsageThreshold(long threshold)
このメモリープールが使用量しきい値をサポートしている場合、このメモリープールのしきい値を指定された threshold 値に設定します。
|
getObjectName
String getName()
MemoryType getType()
MBeanServer アクセス:
MemoryType のマップ型は String、値は MemoryType の名前です。
MemoryUsage getUsage()
このメソッドは、このメモリープールの現在のメモリー使用量のベストエフォートの評価を行うよう Java 仮想マシンに要求します。一部のメモリープールでは、このメソッドは評価値の判定にいくらかの計算を必要とする負荷の大きい操作になる可能性があります。実装は、該当する状況をドキュメント化する必要があります。
このメソッドは、システムメモリー使用量の監視とメモリー不足条件の検出に使用するために設計されています。
MBeanServer アクセス:
MemoryUsage のマップ型は、MemoryUsage
で指定された属性を含む CompositeData です。
MemoryUsage
オブジェクト。このプールが無効な場合は null。MemoryUsage getPeakUsage()
MBeanServe アクセス:
MemoryUsage のマップ型は、MemoryUsage
で指定された属性を含む CompositeData です。
MemoryUsage
オブジェクト。このプールが無効な場合は null。void resetPeakUsage()
SecurityException
- セキュリティーマネージャーが存在する場合で、呼び出し元が ManagementPermission("control") を持たない場合。boolean isValid()
String[] getMemoryManagerNames()
long getUsageThreshold()
setUsageThreshold
メソッドを使って変更できます。UnsupportedOperationException
- このメモリープールが使用量しきい値をサポートしない場合。isUsageThresholdSupported()
void setUsageThreshold(long threshold)
threshold
- バイト単位の新しいしきい値。負でない数値。IllegalArgumentException
- threshold が負の場合、またはこのメモリープールの使用可能メモリー量の最大値 (定義されている場合) を超える場合。UnsupportedOperationException
- このメモリープールが使用量しきい値をサポートしない場合。SecurityException
- セキュリティーマネージャーが存在する場合で、呼び出し元が ManagementPermission("control") を持たない場合。isUsageThresholdSupported()
, 使用量しきい値boolean isUsageThresholdExceeded()
UnsupportedOperationException
- このメモリープールが使用量しきい値をサポートしない場合。long getUsageThresholdCount()
UnsupportedOperationException
- このメモリープールが使用量しきい値をサポートしない場合。boolean isUsageThresholdSupported()
long getCollectionUsageThreshold()
setCollectionUsageThreshold
メソッドを使って変更できます。UnsupportedOperationException
- このメモリープールがコレクション使用量しきい値をサポートしない場合。isCollectionUsageThresholdSupported()
void setCollectionUsageThreshold(long threshold)
しきい値が正の値に設定されると、このメモリープールでコレクション使用量しきい値の超過チェックが有効になります。しきい値がゼロに設定されると、このメモリープールでコレクション使用量しきい値の超過チェックが無効になります。
threshold
- 新しいコレクション使用量しきい値 (バイト単位)。負でない数値。IllegalArgumentException
- threshold が負の場合、またはこのメモリープールの使用可能メモリー量の最大値 (定義されている場合) を超える場合。UnsupportedOperationException
- このメモリープールがコレクション使用量しきい値をサポートしない場合。SecurityException
- セキュリティーマネージャーが存在する場合で、呼び出し元が ManagementPermission("control") を持たない場合。isCollectionUsageThresholdSupported()
, コレクション使用量しきい値boolean isCollectionUsageThresholdExceeded()
UnsupportedOperationException
- このメモリープールが使用量しきい値をサポートしない場合。long getCollectionUsageThresholdCount()
UnsupportedOperationException
- このメモリープールがコレクション使用量しきい値をサポートしない場合。isCollectionUsageThresholdSupported()
MemoryUsage getCollectionUsage()
MBeanServer アクセス:
MemoryUsage のマップ型は、MemoryUsage
で指定された属性を含む CompositeData です。
MemoryUsage
。このメソッドがサポートされていない場合は null。boolean isCollectionUsageThresholdSupported()
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.