繁体   English   中英

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

[英]Java G1 Garbage collector takes a lot of memory

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

  • Java占用20 Gb RAM
  • “ jmap -histo”-向我显示堆大约有5 Gb RAM

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

编辑:这是统计数据

我的Java进程的RAM统计信息:分配〜50gb,消耗〜20gb

jmap信息:堆大小〜4gb

java procces:分配〜50gb,消耗〜20gb
jmap信息:堆大小〜4gb

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

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

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

请尝试以下操作:优化垃圾收集:

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

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

  • 删除所有不必要的声明

  • 使用异步执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM