我有一个关于Java堆空间的问题。
我有一个使用地理工具从街道网络创建图形的程序。我用它做了一些事情,但我遇到了一个OutOfMemoryError,但我不确定为什么。我使用以下代码来获取空闲内存的大小。
Runtime rt = Runtime.getRuntime();
long maxMb = rt.freeMemory()/(1024*1024);
System.out.println("Your JVM has " + maxMb + " MB of memory left");当我运行我的程序时,似乎有足够的内存(参见输出)。此控制台输出是在OutOfMemory错误发生之前完成的。那么到底出了什么问题呢?当我扩大Java heap空间时,仍然发生了OutOfMemory错误(但还剩下1461MB)。我不知道为什么会这样?有什么想法吗?
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)发布于 2012-11-01 23:56:26
由于输出表明您还有大量内存,并且在数组列表增长期间出现错误,因此我猜测您有一个非常大的数组列表,您可以将对象放入其中。当JVM试图增加列表时,您没有足够的堆空间来容纳列表的两倍大小。
我会调查你在addStrokeSegment()的列表中实际放了多少个对象。
发布于 2012-11-02 00:00:20
以下是调试OOM的一种方法。

发布于 2012-11-01 23:52:18
你应该使用jmap来了解你的内存被填满了什么。
https://stackoverflow.com/questions/13180648
复制相似问题