Java G1 gc占用太多内存

时间:2019-07-02 07:49:12

标签: java garbage-collection g1gc

例如,我将-Xmx设置为40G。我希望我的Java处理器使用的内存不会超过40G。

我的程序在cms-gc上运行正常。

但是当我使用相同的内存(甚至多15%的内存)切换到G1 gc时。

它总是被oom killer杀死。

我发现了一些类似这样的文章:Why does my Java process consume more memory than Xmx?

它表示:

 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.

所以我想知道,如何限制g1 gc使用的内存以及为什么g1使用这么多的额外内存

2 个答案:

答案 0 :(得分:0)

您提到的文章(Why does my Java process consume more memory than Xmx?)对其进行了清晰的概述。

Java进程需要内存来做几件事:

  • Java堆(又名内存分配池)
  • 为应用程序中的每个线程堆叠
  • JVM本身使用的内存(也称为permgen)
  • 由本机功能(JRE或第三方库)分配的内存

另一个问题是,某些JVM内存未计为 permgen 内存,因此无法控制。

因此,如果要将Java应用程序限制为40 GB,则必须考虑所有类型的内存。从较小的值开始,例如:

-Xmx30g -XX:MaxPermSize=1g -Xss1m

然后观察您的进程的内存使用情况,如果该进程安全地远离目标40GB,则增加Xmx

答案 1 :(得分:0)

您不能限制G1需要使用的内容。如果可以-您会破坏一切或死于堆内存不足错误,因为G1没有足够的资源来正常运行。要解释为什么,此算法需要使用额外的内存,这并不简单。它至少需要存储card tableremembered setshere is why的空间。它需要SATB队列的内存,这些是GC周期处于活动状态时“拦截”堆读写的一些数据结构。我敢打赌,还有更多。通常,如果要并发(以便在GC周期处于活动状态时运行应用程序),则需要提供更多的内存。