Heap分区和分代概念

Heap分区的目的
1. 为了分代:不同代的对象放到不同的内存分区中,实现“代提升”,也方便实现对不同分代采用不同的垃圾收集算法。
2. 垃圾收集算法需要:新生代GC使用到复制算法,该算法需要将对应的分区划分成三个分区:Eden/S0/S1。

术语
Generation代
- YongGeneration/NewGeneration:新生代,在Eden/S0/S1的存活的对象。
- OldGeneration:老年代,在Tenured区存活的对象。
- PermanentGeneration:永久代。
Space 区
- Eden:伊甸园区,是新生代的一个区。
- Survivor:幸存区,属于新生代,为了复制算法的需要。一般分成大小相等的两个区(S0/S1或者From/To)。
- Tenured:存放老年代的区域。
- Permanent:终身区。

下图:Hotspot 的 Heap 分区

下图:VisualVM 中通过 VisualGC插件显示的分区

Eden/S0/S1 新生代
[Eden ][S0 ][S1 ]
S0/S1是大小相当的两个区域,共同组成Survivor区。
空间比例:Eden:S0==8:1。设定方法:-XX:SurvivorRatio=8。
新生对象在Eden/S0或者Eden/S1中分配,Eden区的对象量达到一个阈值后,发生一次新生代GC。

Old 老年代
每个对象有“对象年龄计数器”。对象由Eden收集到Survivor区后,年龄+1。进行新生代GC后,年龄+1。依次,当年龄>=15后进入老年代。
最大年龄阈值设定:-XX:MaxTenuringThreshold。
动态年龄:如果在Survivor中所有相同年龄对象占用了空间的一半多,大于等于上述年龄的对象直接进入老年代。
大对象(比如大的数组)直接进入老年代。阈值设定:-XX:PretenureSizeThreshold。

Perm 永久代(PermanentGeneration)
用于存放不变对象,如类、方法、字符串等。
Java7把驻留字符串(intentd string)放到了老年代区。Java8中移除了Hotspot的永久代区。

http://www.cnblogs.com/caca/p/jvm_gc_algorithm_heap_space.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值