首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java堆内存

Java堆内存
EN

Stack Overflow用户
提问于 2012-11-01 23:48:54
回答 4查看 3.3K关注 0票数 0

我有一个关于Java堆空间的问题。

我有一个使用地理工具从街道网络创建图形的程序。我用它做了一些事情,但我遇到了一个OutOfMemoryError,但我不确定为什么。我使用以下代码来获取空闲内存的大小。

代码语言:javascript
复制
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)。我不知道为什么会这样?有什么想法吗?

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-01 23:56:26

由于输出表明您还有大量内存,并且在数组列表增长期间出现错误,因此我猜测您有一个非常大的数组列表,您可以将对象放入其中。当JVM试图增加列表时,您没有足够的堆空间来容纳列表的两倍大小。

我会调查你在addStrokeSegment()的列表中实际放了多少个对象。

票数 0
EN

Stack Overflow用户

发布于 2012-11-02 00:00:20

以下是调试OOM的一种方法。

  1. 将最大堆大小调整为合理的大小,例如256MB。适当地保持较低的值将有助于您完成步骤3.
  2. 将-XX:+HeapDumpOnOutOfMemoryError添加到命令行。这将在OOM在Eclipse Memory Analyzer中encountered.
  3. Open转储之后转储内存,并尝试分析最大的对象。它可以生成如下所示的报告。

票数 1
EN

Stack Overflow用户

发布于 2012-11-01 23:52:18

你应该使用jmap来了解你的内存被填满了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13180648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档