0

Java ヒープ領域について質問があります。

geotools を使用してストリート ネットワークからグラフを作成するプログラムがあります。私はそれでいくつかのことをしていますが、OutOfMemoryError に遭遇しましたが、その理由はわかりません。次のコードを使用して、空きメモリの量を取得します。

Runtime rt = Runtime.getRuntime();
long maxMb = rt.freeMemory()/(1024*1024);
System.out.println("Your JVM has " + maxMb + " MB of memory left");

そして、プログラムを実行すると、十分なメモリがあるようです (出力を参照)。このコンソール出力は、OutOfMemory エラーが発生する直前に行われます。それで、何がうまくいかないのですか?Java ヒープ領域を拡大しても、OutOfMemory エラーが発生します (ただし、1461 MB が残っています)。なぜそれが起こるのか分かりませんか?何か案は?

Your JVM has 981 MB of memory left
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at masterthesis.datastructures.Stroke.addStrokeSegment(Stroke.java:78)
at masterthesis.algorithms.StrokeBuilder.buildStroke(StrokeBuilder.java:145)
at org.geotools.test.Main.main(Main.java:109)
4

4 に答える 4

0

Javaを読んでみてください:OutOfMemoryError ExceptionとfreeMemory()

Runtime.freeMemory()javadocは、「将来割り当てられるオブジェクトに現在使用可能なメモリの合計量の概算」を返すと述べています。

すべての動的構造が機能する方法は、メモリをチャンクで割り当てることです。HashMapがいっぱいになると、もう1つのオブジェクトに余分なスペースが割り当てられることはありません。あるサイズのチャンクを割り当てます。JVMでの正確な動作方法はわかりませんが、現在使用しているメモリの2倍の量を割り当てようとする場合があります。

于 2012-11-01T15:52:41.923 に答える
0

jmapを使用して、メモリが何で満たされているかを把握する必要があります。

于 2012-11-01T15:52:18.260 に答える
0

出力には大量のメモリが残っていることが示され、配列リストの拡張中にエラーが発生するため、オブジェクトを配置する非常に巨大な配列リストがあると思います。JVMがリストを拡張しようとすると、十分な数がありません。リストのサイズが2倍になるのに対応するヒープスペース。

を使用して実際にリストに追加したオブジェクトの数を調査しますaddStrokeSegment()

于 2012-11-01T15:56:25.737 に答える