【发布时间】:2019-02-08 09:16:32
【问题描述】:
我有大型数据库的项目。为了解析它,我使用带有 G1 垃圾收集器的 java。 当程序运行很长时间时,java开始消耗大量内存。 但是当我检查java堆时,大小要小得多。例如:
- Java 占用 20 Gb 的 RAM
- “jmap -histo” - 显示堆大约有 5 Gb 的 RAM
问题:什么占用了我剩余的 RAM?这是G1的开销吗?
编辑:这里是统计数据
java procces:分配 ~50gb,消耗 ~20gb
jmap 信息:堆大小 ~4gb
【问题讨论】:
-
这就是 JVM 堆的工作方式,您将
-Xmx和-Xms指定为 20GB,当前只需要 5GB... -
@Eugene 我说的是显式 RAM 消耗,-Xmx40G,java 消耗 20G 但堆大小只有 4G
-
哦,所以进程本身消耗20G,堆只有4个?你是怎么测量这 20 个的?
-
@Eugene 我使用“htop”来监控进程,我添加了一些图片来展示
-
是的 20Gb 是“当前状态”。当前状态有历史。当它一次需要 20Gb 时,它必须分配该数量的内存,当它不再需要它时,即包含的对象已被垃圾收集,不了解 Java 堆的外部工具将继续说这个过程已分配了该数量的内存。而在 JVM 内部,大部分内存被认为是空闲的,准备好被新对象填充。 • 堆外内存可以包括直接字节缓冲区。只要可用 RAM 允许,您可以拥有尽可能多和尽可能大的空间。
标签: java garbage-collection g1gc