2011-06-27 9 views
5

私はEclipseを使用しています。問題は、割り当てられたメモリが512MB未満の場合、アプリケーションがクラッシュすることです。ここで、大量のメモリを徹底的に処理する前に、プログラムの使用可能なメモリをチェックする方法はありますか? は、例えば、私たちが利用できるようJVMのヒープサイズを確認することができます知っている:利用可能なheapSizeをプログラムでチェックしますか?

long heapSize = Runtime.getRuntime().totalMemory(); 
System.out.println("Heap Size = " + heapSize); 

問題があり、これは、JVMのヒープサイズを与えます。 Eclipseを使用してもそれを増やしても機能しません。 Eclipseでは、VMの引数を変更すると動作します。しかし、上記の文からの出力は常に同じです。特定のアプリケーションのためにどれくらいのメモリが割り当てられているかを正確に知るコマンドがありますか?

+0

多分問題は日食です。 NetbeansやIntelliJを試しましたか? – telm

+0

私は試しましたが、どのIDEでも同じ結果になっています – Johnydep

+0

ランタイムにはtotalMemory()とmaxMemory()の両方があります。私の経験ではmaxMemoryが大きいです。 –

答えて

13

JMXを使用すると、実行時にヒープメモリの使用状況を収集できます。


コード例:

import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryType; 
import java.lang.management.MemoryUsage; 

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) { 
    if (mpBean.getType() == MemoryType.HEAP) { 
     System.out.printf(
      "Name: %s: %s\n", 
      mpBean.getName(), mpBean.getUsage() 
     ); 
    } 
} 

出力例:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K) 
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K) 
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K) 

あなたは "エデンスペース" や "サバイバースペース" について質問がある場合は、How is the java memory pool dividedをチェックしてください

+0

Yessしかしそれは本当に役立つdosent。 JVMなどのアプリケーションに割り当てられたメモリの総量を知りたいだけです。構成から私はそれが512MBより少ないかどうか知っています、それはdosentの仕事です。しかし、どうすればこれを実用的にチェックできますか?実行時にクラッシュすると、このアプリケーションがパッケージ化されているため、エラーの性質についてユーザーに知らせるメッセージが表示されるはずです。悪い場合には、私は例外をキャッチし、メモリサイズを増やすようにユーザーに促しますが、それはクラッシュの後ではなく、開始前ではありません。 Unfortuanatellyそれはクラッシュする前に約30分かかる、それは時間の無駄だろう。 – Johnydep

+0

JAVA_OPTSまたはCATALINA_OPTSを設定しましたか? '-Xmx'(最大ヒープサイズ)パラメータはどうでしょうか?ある時点でメモリが不足しているためにクラッシュする可能性がありますか?ログファイルは何を表し、outOfMemoryエラーは何ですか? – Danijel

0

このアイデアはどうですか? JVM command line with this APIを確認することができます。

-Xmx…パラメータのコマンドラインをスキャンして、十分なヒープが指定されていることを確認できます。