Java G1垃圾收集器占用大量内存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java G1垃圾收集器占用大量内存相关的知识,希望对你有一定的参考价值。
我有大型数据库的项目。要解析它我使用java与G1垃圾收集器。当程序运行很长一段时间后,java开始消耗大量内存。但是当我检查java堆时,它的大小要小得多。例如:
- Java需要20 Gb的RAM
- “jmap -histo” - 告诉我堆大约是5 Gb的RAM
问题:剩余的RAM是什么?这是G1的开销吗?
编辑:这是统计数据
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垃圾收集器占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章