java G1 gc 占用太多内存

yun*_*fan 5 java garbage-collection g1gc

例如,我将-Xmx设置为40G。我预计我的java处理器不会使用超过40G。

我的程序在 cms-gc 上运行良好。

但是当我更改为具有相同内存的 G1 gc 时(甚至多了 15% 的内存)。

它总是被 oom 杀手杀死。

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

其表达的是:

 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*odo 2

你提到的文章(为什么我的Java进程比Xmx消耗更多的内存?)清楚地概述了这一点。

Java 进程需要内存来完成以下几件事:

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

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

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

-Xmx30g -XX:MaxPermSize=1g -Xss1m
Run Code Online (Sandbox Code Playgroud)

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

  • Java 8 或更高版本中没有 Permgen,因此为这些版本指定“-XX:MaxPermSize=1g”将不起作用。 (2认同)