jvm中堆和非堆的划分

时间:2022-03-22 14:16:59

哪位大神能给我讲解一个问题,我们使用参数-Xms -Xmx设置堆内存的最小值和最大值,-XX:PermSize -XX:MaxPermSize设置非堆内存的最小值和最大值,这里的非堆内存包括Permanent Space(永久存储区)。但是为什么又说jvm中的堆内存分为三部分:Permanent Space 永久存储区、Young Generation Space 新生区、Tenure generation space 养老区呢,这个永久保存区域到底是属于哪个?

解决方案

欧耶,我终于搞明白了,谢谢各位的回答。如果还有人不明白,请参考这个链接(http://www.cnblogs.com/dingyingsi/p/3760447.html),我就是看这个看明白的。
确实是由于GC将分代收集策略扩展至jvm堆中的方法区(也就是“Permanent Space 永久代“),实际上方法区是堆的一个逻辑部分。

解决方案二:

Permanent Space 永久存储区、Young Generation Space 新生区、Young Generation Space 新生区是GC中划分的概念,GC采用分代收集策略时(Generational Collection),将内存分为几个区域,将不同生命周期的对象放在不同的区域中:Young Generation Space 新生区、Tenure generation space 养老区、Permanent Space 永久存储区。Young Generation Space和Tenure generation space在堆内存中,而Permanent Space 在非堆内存中,而不是JVM中堆内存划分这三个部分。

解决方案三:

这个问题感觉说不清。。jvm规范里就没有划分这些吧。只是分代实现才有了perm区,年轻代,年老代等。。
按照正常理解,堆分perm区堆和heap堆,都是堆。heap堆里再分年轻代年老代等等。perm区不占用-xmx参数的内存。是单独设置的。

解决方案四:

首先你理解错了,-Xmx,-Xms:设置JVM最大/最小堆内存。
而java GC回收策略是分代回收,就是你说的永久区,新生区,老年区,这三种区域的总和就是-Xms的总和。永久区就是三代中的一种啊。