2012-03-16 5 views
9

私はルームメイトのコンピュータで週末に遺伝的アルゴリズムを実行していますが、このような長期間にわたりメモリが不足する恐れがあります。しかし、私のアルゴリズムは、あまり有用でない結果をトリムするのがかなり容易になるような方法で動作します。もしプログラムがヒープスペースを使い切っていることを知らせる方法があれば、おそらく部屋を作ってもう少し時間がかかる。Javaプログラムは、ヒープスペースが不足していることを検出できますか?

JVMのヒープスペースが不足しているとき、OutOfMemoryError?の前に通知する方法はありますか?

+0

[Javaヒープサイズを動的に監視する方法]の複製が可能ですか?(http://stackoverflow.com/questions/2163228/how-to-dynamically-monitor-java-heap-size) –

+0

@Andreas_D、この質問は扱いますプログラムの外部監視について。ヒープスペースが足りなくなると自分のプログラムが反応するようにしたい。 – zneak

+0

他の質問に対する回答には、内部および外部の監視ソリューションが含まれます。 –

答えて

6

特定のしきい値に達すると呼び出されるjavax.management.NotificationListenerを登録できます。リスナーはNotificationListenerをの独自の実装である

final MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); 
final NotificationEmitter ne = (NotificationEmitter) memBean; 

ne.addNotificationListener(listener, null, null); 

final List<MemoryPoolMXBean> memPools = ManagementFactory 
    .getMemoryPoolMXBeans(); 
for (final MemoryPoolMXBean mp : memPools) { 
    if (mp.isUsageThresholdSupported()) { 
    final MemoryUsage mu = mp.getUsage(); 
    final long max = mu.getMax(); 
    final long alert = (max * threshold)/100; 
    mp.setUsageThreshold(alert); 

    } 
} 

よう

何か。

+0

それは私が望むもののように見える。私はそれを試してみましょう。 – zneak

+0

例をご希望の場合は、http://code.google.com/p/pitestrunner/でこのアプローチを使用します。 MemoryWatchdogクラスを探し、それがMutationTestSlaveによって使用されていることを確認してください。 – henry

+0

購読時にフィルタを追加することを忘れないでください。NotificationFilter filter = x - > MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED.equals(x.getType()); ne.addNotificationListener(tryPreventOom、filter、null); –

3

あなたはこの試みることができます:ここに見られるような

// Get current size of heap in bytes 
long heapSize = Runtime.getRuntime().totalMemory(); 

// Get maximum size of heap in bytes. The heap cannot grow beyond this size. 
// Any attempt will result in an OutOfMemoryException. 
long heapMaxSize = Runtime.getRuntime().maxMemory(); 

// Get amount of free memory within the heap in bytes. This size will increase 
// after garbage collection and decrease as new objects are created. 
long heapFreeSize = Runtime.getRuntime().freeMemory(); 

を - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html

+0

これは正常なハックのためにできると思いますが、特定のしきい値に達すると、一定の間隔でメモリステータスをポーリングするのではなく、自動的に通知されます(iOSのメモリ通知など)。 – zneak

+0

私は、バックグラウンドでこれを行うためにポーラーを自分で作成しない限り、特定のしきい値に基づいて自動的に通知を受ける方法は知らない。 – Nikhil

1

だけで、必要であれば、彼らは宇宙の理由で廃棄され、廃棄結果を得るためWeakReferencesを使用しています。

+0

オブジェクトを削除可能と判断する前にレビューする必要があるため、GCの裁量に委ねることはできません。 – zneak

+0

+1:または、より長く存続するSoftReferencesを使用して、WeakReferenceは常にGC上で破棄されます。 ReferenceQueueは、クリーンアップされるかもしれないオブジェクトの通知を保持することができます。 –

0

私はこれについてはわかりませんが、JConsoleあなたの目的を解決できませんか?

関連する問題