为什么FullGC无法释放物理内存(RES)?

时间:2015-08-12 10:36:21

标签: java garbage-collection

以下是 RES 增长曲线: enter image description here

然后是老一代占用率: enter image description here

通过jmap强制完整GC,老一代确实减少了但是RES一直在增长......

pmap结果:

enter image description here

anon 的含义是什么,它是非堆内存?

修改

enter image description here

enter image description here

enter image description here

enter image description here

堆只使用了大约500MB,但RSS超过15GB,pmap显示许多不强大约65MB。

我的问题是什么可能消耗堆外的内存?谢谢!

2 个答案:

答案 0 :(得分:1)

  

anon的含义是什么,它是非堆内存?

anon只表示mmap()MAP_ANON一致。鉴于RSS它可能是堆。

  

为什么FullGC无法释放物理内存(RES)?

您必须区分最大堆大小,堆占用和已提交堆大小。

  • 最大堆大小是预先保留但不一定由页面支持的地址空间
  • 已提交的堆大小将由页面支持,通常为零/预配。这通常会影响你的RSS
  • 占用率是实际包含对象而非零的分数

只有当提交的堆大小减少时,页面才能被释放回操作系统。

向操作系统退出/产生内存取决于GC算法,JVM版本和调整参数(暂停时间目标,MaxHeapFreeRatio)。

您列出的其他区域可能是直接的ByteBuffer分配,但它们也可能是本机库的其他分配。 检查java.nio.DirectByteBuffer实例的堆转储应提供进一步的见解。

答案 1 :(得分:1)

Oracle的JVM有多种算法来管理内存。 其中一些可以将未使用的内存页面返回给OS,其他则不能。

默认算法(并行收集器)永远不会将内存返回给操作系统。

以下两种算法可以将内存返回到OS

  • 串行GC(单螺纹标记扫描紧凑型)
  • G1

您可以找到可用算法和相关JVM选项的摘要here