【问题标题】:java G1 gc takes too much of memoryjava G1 gc占用太多内存
【发布时间】:2019-11-12 19:43:10
【问题描述】:

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

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

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

它总是被oom杀手杀死。

我发现了一些这样的文章: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 使用这么多额外的内存

【问题讨论】:

    标签: java garbage-collection g1gc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你提到的文章 (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

      【讨论】:

      • 实际上,我有你为我的程序指出的所有参数。但仍然被 oom 杀手杀死。但是当我使用 cms gc.它工作正常(但很慢)。所以我想知道为什么。
      • GC1 使用的内存比 Xmx 参数未考虑的 CMS 多。对于 GC1,您必须降低 Xmx 以实现与 CMS 相同的整体进程大小。一旦进程大小相同,OOM 就不会再杀死它了。 OOM只关心进程内存,不知道Java内部的内存类型。
      • 所以我只想知道能不能限制G1 gc内存。我
      • 什么是“gc内存”?
      • Java 8 或更高版本中没有 Permgen,因此为这些版本指定 -XX:MaxPermSize=1g 将无效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2015-10-14
      • 2013-07-18
      • 2013-07-11
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多