2

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

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

我认为方法调用(求解器可能使用大量回溯)被分配在堆栈上,所以这不应该是问题所在。当我使用 Xmx 参数减少最大内存时,应用程序失败并出现异常:

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

所以看起来,其余的不是未使用的未收集内存(因为在这种情况下,GC 会释放它(并且不会失败))。

谢谢你的帮助。

4

2 回答 2

1

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

于 2010-12-26T20:02:02.637 回答
0

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

感谢您的回复。

于 2010-12-26T21:13:19.933 回答