私はいくつかのグラフライブラリを学習し、テストしています。奇妙な問題にぶち当たっています(グラフに固有のものではありませんが、これは一般的なJava関連です)。私は 'java.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えています'というメッセージを表示しています。 I understand this error means that garbage collecting spending most of the cpu time and not returning any memoryしかし、私はこれを回避する方法がわかりません。JVMに使用可能なメモリがたくさんある場合、なぜ 'java.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えました'が表示されますか?
基本的に私は(学習目的のために)、メモリ内に多数のグラフノードを作成するのに必要な時間を見たいと思っています。私のシステムはセントを実行しており、私は7ギガのRAMを持っていますが、プログラムは25%を超えることはありません(私は 'トップ'経由で見ることができます) .jar -Xmx7g -XX:+ UseConcMarkSweepGC -XX:-UseGCOverheadLimit '(jungtester.jarは私のプログラムです)。使用可能なメモリをすべて使用していないようだが、およそ350万のノードの後で死んでいる。これはちょうどforループなので奇妙だ。だから、メモリがいっぱいになるまでノードを追加するだけだと思った。
私はJVMの内部の仕組みにはかなり新しいので、これをどのように過去のものにするかの提案はすばらしくなるでしょう。
それが助け場合は、ここではコードです:
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
public class main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("starting...");
long startTime = System.currentTimeMillis();
DirectedGraph<Integer,Integer> graph = new DirectedSparseGraph<Integer, Integer>();;
graph.addVertex(1);
graph.addVertex(2);
graph.addEdge(1, 1,2);
for (int i = 0; i < 1000000; i++) {
graph.addVertex(i);
//System.out.println(i + " means we are " + (float) i/1000000 + "% done.");
}
long endTime1 = System.currentTimeMillis();
System.out.println("done adding 1000000 in " + (endTime1 - startTime));
for (int i = 1000001; i < 10000000; i++) {
graph.addVertex(i);
graph.addEdge(i, i, i-1000000);
System.out.println(i + " means we are " + (float) i/1000000000 + "% done.");
}
long endTime = System.currentTimeMillis();
System.out.println("It took " + (endTime - startTime));
}
}
UPDATE:私はそれが動作するようになったが、私はなぜわからないが、順序が重要。私の上のコマンドは、私が置いた後に何も取らなかった - 瓶、しかし私は最後に - 瓶を追加したときに動作するようです。
アプリケーションの実行中にJVMを監視するためにjconsole(使用可能なXがある場合)を使用すると、何が起きているかが表示されます。 Topは、jconsoleのようにJVMのリアルタイム統計を表示するほど細かくはありません。 – robertvoliva
これは32ビットまたは64ビットマシンで実行していますか? 32ビットシステムでは、7GのRAMは使用できません。 –
@PéterTörök - そうですが、32ビットマシンで '-Xmx7g'を使用すると、JVMは起動しません。だから私はこれが問題だとは思わない。 –