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

时间:2018-09-03 10:13:58

标签: java garbage-collection g1gc

我有大型数据库项目。为了解析它,我将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处理程序:分配了〜50gb,消耗了〜20gb
jmap信息:堆大小〜4gb

2 个答案:

答案 0 :(得分:2)

我理解了这个问题。正如@Holger提到的,ram被分配给了Java进程,但没有完全堆满。但是原因,为什么G1分配了这么多ram:

如果G1需要分配很多大型区域,那么它会遭受损失。每当对象大小>区域大小的50%时,就会创建它们。它们将浪费空间,因为该区域将不会再产生其他任何东西。因此,如果其大小为51%,您将浪费该区域的49%。更糟糕的是,如果一个区域为2MB,而您的对象为2.1MB,则第二个区域将浪费1.9MB。如果分配大对象,请调整XX:G1HeapRegionSize。

答案 1 :(得分:0)

RAM消耗将归因于巨大的数据库大小和结果集的大小

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

  • 请警惕String Concatenation运算符(+),请改用concat()

  • 如果使用spring,请尝试setFetchSize(一次要获取的行数) 但是,使用setFetchSize将增加您的执行时间,但是它可以节省内存

  • 删除所有不必要的语句

  • 使用异步执行