我遇到了java性能问题。我尝试使用GC1,但它并没有让事情变得更好。我唯一的问题是为什么JVM保留了java堆空间,即使它没有被使用? 正如你在图片中看到的那样,批量工作在10:30左右完成,但垃圾收集器没有被触发清理。所以我在10:52手动完成,然后释放了已用过的空间,但JVM仍然分配了堆(8GB)。为什么?
答案 0 :(得分:3)
我做过与你做过的完全相同的事情时也看到了这种趋势(并在这里看到)。解释非常简单:JVM不会向操作系统返回内存,即使它有很多空闲内存。我不知道why
的具体细节,但这与从OS
回忆内存费用昂贵(这是超简化的)这一事实有关。 / p>
所以我想这里的简单答案是 - 这是正常的。
在这里!我找到了我实际阅读过this的地方。
答案 1 :(得分:1)
G1GC与应用程序线程同时执行全堆操作,例如全局标记。 这可以防止与堆成比例的中断。
通过G1GC是一个新时代的垃圾收集算法,只有在以下情况下才能从CMS或老年垃圾收集中切换:
有关G1内部工作的更多详细信息,请访问:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
答案 2 :(得分:0)
仅当应用程序需要额外内存时才会触发GC。 gc是昂贵的任务,vm将决定何时运行它。如果您怀疑您的程序需要内存并且GC没有释放它,那么这是一个问题。如果您可以分享解决此问题的测试用例,我们将解决此问题。