Java使用堆与分配的对象大小

时间:2010-12-26 19:36:29

标签: java profiling heap constraint-programming

我有一个可能是愚蠢的问题。我目前正在测试CSP求解器choco和jacop。当我运行应用程序的分析(图形着色,大约3000个节点)时,我不完全理解结果。

profiler声明的已用堆空间大约是1GB内存。创建的所有对象的总和小于100MB。其他900MB内存在哪里?

我认为方法调用(求解器可能使用大量回溯)正在堆栈中进行,所以这不应该是问题。当我通过使用Xmx param减少最大内存时,应用程序失败,异常:

线程“main”中的异常java.lang.OutOfMemoryError:超出GC开销限制

所以看来,其余的都没有未使用的未收集内存(因为在这种情况下GC会处理它(并且不会失败))。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你能得到堆的地图吗?很可能它是碎片化的,因此这些100M的对象分布在整个存储空间中。所需的内存既是分配对象的函数,也是它们被分配然后被引用的速度。该错误意味着内存区域对于工作负载而言太小,垃圾收集器正在消耗大量CPU来管理它,并且它超出了允许的阈值。

答案 1 :(得分:0)

Amir Afghani的评论可能是正确的。 Netbeans 6.9.1中的类(对象)可能以某种方式被过滤(?或者分析器是假的?),因为当我从java visual VM执行堆转储并对其进行分析时,它显示了我!非常!不同的数字(总和与使用的堆相同)。

感谢您的回复。

相关问题