通过jmap强制完整GC,老一代确实减少了但是RES一直在增长......
pmap结果:
anon 的含义是什么,它是非堆内存?
修改:
堆只使用了大约500MB,但RSS超过15GB,pmap显示许多不强大约65MB。
我的问题是什么可能消耗堆外的内存?谢谢!
答案 0 :(得分:1)
anon的含义是什么,它是非堆内存?
anon只表示mmap()
与MAP_ANON
一致。鉴于RSS它可能是堆。
为什么FullGC无法释放物理内存(RES)?
您必须区分最大堆大小,堆占用和已提交堆大小。
只有当提交的堆大小减少时,页面才能被释放回操作系统。
向操作系统退出/产生内存取决于GC算法,JVM版本和调整参数(暂停时间目标,MaxHeapFreeRatio
)。
您列出的其他区域可能是直接的ByteBuffer分配,但它们也可能是本机库的其他分配。
检查java.nio.DirectByteBuffer
实例的堆转储应提供进一步的见解。
答案 1 :(得分:1)
Oracle的JVM有多种算法来管理内存。 其中一些可以将未使用的内存页面返回给OS,其他则不能。
默认算法(并行收集器)永远不会将内存返回给操作系统。
以下两种算法可以将内存返回到OS
您可以找到可用算法和相关JVM选项的摘要here。