首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java G1垃圾收集器占用大量内存

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

Stack Overflow用户
提问于 2018-09-03 10:13:58
回答 2查看 1.8K关注 0票数 3

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

  • Java占用20 Gb内存
  • "jmap -histo“--向我展示堆大约是5gb内存。

问题:我剩下的内存是什么?这是G1的开销吗?

编辑:这是统计数据

java过程:分配~50,消耗~20

jmap信息:堆大小~4gb

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-05 10:27:46

我理解这个问题。正如@Holger所提到的,ram被分配给java进程,但没有完全填充堆。但是的理由为什么G1分配这么多的ram:

如果G1需要分配大量巨大的区域,它就会受到影响。每当对象大小超过区域大小的50%时,就会创建它们。它们将浪费空间,因为该区域将不会产生任何其他东西。因此,如果它的大小是51%,你将浪费这个地区的49%。更糟糕的是,如果一个区域是2MB,而您的对象是2.1MB,那么它将在第二个区域中浪费1.9MB。如果分配大型对象,请调整XX:G1HeapRegionSize。

票数 4
EN

Stack Overflow用户

发布于 2018-09-03 10:28:27

内存消耗将是由于庞大的数据库大小和结果集的大小。

尝试以下内容:优化垃圾收集:

  • 提防字符串连接运算符(+)使用concat()代替
  • 如果使用spring,尝试使用setFetchSize (每次要获取的行数)使用setFetchSize,但是会增加执行的时间,但这是内存高效的
  • 删除所有不必要的语句
  • 使用异步执行
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52147644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档