我有一个有大型数据库的项目。为了解析它,我在G1垃圾收集器中使用了java。当程序长时间运行时,java开始消耗大量内存。但是,当我检查java堆时,大小要小得多。例如:
问题:我剩下的内存是什么?这是G1的开销吗?
编辑:这是统计数据


java过程:分配~50,消耗~20
jmap信息:堆大小~4gb
发布于 2018-09-05 10:27:46
我理解这个问题。正如@Holger所提到的,ram被分配给java进程,但没有完全填充堆。但是的理由为什么G1分配这么多的ram:
如果G1需要分配大量巨大的区域,它就会受到影响。每当对象大小超过区域大小的50%时,就会创建它们。它们将浪费空间,因为该区域将不会产生任何其他东西。因此,如果它的大小是51%,你将浪费这个地区的49%。更糟糕的是,如果一个区域是2MB,而您的对象是2.1MB,那么它将在第二个区域中浪费1.9MB。如果分配大型对象,请调整XX:G1HeapRegionSize。
发布于 2018-09-03 10:28:27
内存消耗将是由于庞大的数据库大小和结果集的大小。
尝试以下内容:优化垃圾收集:
https://stackoverflow.com/questions/52147644
复制相似问题