我有一个可能很愚蠢的问题。我目前正在测试CSP解算器choco和jacop。当我运行应用程序的性能分析(图形着色,大约3000个节点)时,我不能完全理解结果。
profiler声明的已用堆空间约为1 1GB内存。创建的所有对象的总和小于100MB。其他900MB的内存在哪里?
我认为方法调用(解算器可能使用大量回溯)被分配到堆栈上,所以这里不应该是问题所在。当我使用Xmx参数减少最大内存时,应用程序失败,并出现异常:
线程"main“java.lang.OutOfMemoryError中出现异常:超出GC开销限制
因此,看起来剩余的内存不是未使用的未收集的内存(因为在这种情况下,GC将释放它(并且不会失败))。
谢谢你的帮助。
发布于 2010-12-27 05:13:20
Amir阿富汗人在他的评论中可能是正确的。Netbeans 6.9.1中的类(对象)可能以某种方式被过滤了(?或者分析器是假的?),因为当我从java visual VM执行堆转储并分析它时,它显示了!非常!不同的数字(总和与使用的堆相同)。
感谢您的回复。
发布于 2010-12-27 04:02:03
你能拿到堆的地图吗?它很可能是碎片化的,所以这100M的对象分散在整个内存空间中。所需的内存既是已分配对象的函数,也是它们被分配然后被解除引用的速度的函数。该错误意味着内存区域对于工作负载来说太小,垃圾收集器在管理它时消耗了大量CPU,并且超出了允许的阈值。
https://stackoverflow.com/questions/4535140
复制相似问题