Java G1垃圾收集器占用大量内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java G1垃圾收集器占用大量内存相关的知识,希望对你有一定的参考价值。

我有大型数据库的项目。要解析它我使用java与G1垃圾收集器。当程序运行很长一段时间后,java开始消耗大量内存。但是当我检查java堆时,它的大小要小得多。例如:

  • Java需要20 Gb的RAM
  • “jmap -histo” - 告诉我堆大约是5 Gb的RAM

问题:剩余的RAM是什么?这是G1的开销吗?

编辑:这是统计数据

RAM stats of my java procces: allocated ~50gb, consumed ~20gb

jmap info: heap size ~4gb

java procces:已分配~50gb,消耗~20gb jmap info:堆大小~4gb

答案

我明白了这个问题。正如@Holger所提到的那样,ram被分配给java进程但没有完全填充堆。但是G1分配这么多ram的原因是:

如果需要分配很多大区域,G1会受到影响。每次对象大小>区域大小的50%时,都会创建它们。它们将浪费空间,因为该地区不会产生任何其他因素。因此,如果它的大小是51%,你将浪费49%的区域。更糟糕的是,如果一个区域是2MB而你的对象是2.1MB,它将在第二个区域浪费1.9MB。如果分配大对象,请调整XX:G1HeapRegionSize。

另一答案

RAM消耗将是由于巨大的数据库大小和结果集的大小。

尝试以下方法:优化垃圾收集:

  • 警惕String Concatenation运算符(+)改为使用concat()
  • 如果使用spring,使用setFetchSize尝试setFetchSize(一次获取的行数)会增加执行时间,但是内存效率高
  • 删除所有不必要的声明
  • 使用异步执行

以上是关于Java G1垃圾收集器占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

Java G1垃圾收集器中的类卸载(G1GC)

java - GC垃圾收集器详解

详解 JVM Garbage First(G1) 垃圾收集器

G1 与 CMS 两个垃圾收集器的对比

Pyspark G1垃圾收集器

G1收集器