JVM 年轻代
1、 为什么会有年轻代?
优化gc性能,如果没有分代,所有对象都在一块,gc的时候我们要找到无用对象,这样就会对堆的所有区域进行扫描,而我们很多对象都是朝生夕死的,如果分代的话,我们将创建的对象放到某一地方,当gc的时候先把这块朝生夕死对象的区域进行回收,这样就会腾出很大的空间出来
2、年轻代的GC
 HotSpot将年轻代划分为三个部分:1个Eden 区+2个survivor区(分别叫做from和to).默认比例是8:1:1,为什么是这个比例,接下来我们会聊到,一般情况下,新创建的对象会被分配到Eden区,这些对象经过一次minor gc后,如果仍然存在,将会被移动到survivor区,对象在survivor区中每熬过一次,年龄加一,当他的年龄增加到一定程度的时候就会被移动到年老代中
因为年轻代都是朝生夕死(80%以上)的,所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的节本思想是将内存分为两块,每次只使用其中一块,当一块内存用完,就将还存活的对象复制到另一块上面,复制算法不会产生内存碎片。
在gc开始的时候,对象只会存在于eden和名为from的survivor中,survivor的to区域是空的,紧接着进行gc,eden中存活的对象会被复制到to去,而在from区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值 可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到to区域。经过这次gc之后,eden区和from区会被清空。这个时候 from 和to 会交换角色,也就是新的to就是上次gc前的from.新的from就是上次gc前的to。不管怎样,都会保证to的survivor区域是空的。minor gc会一直重复这样的过程。直到to区被填满。to区被填满之后,会将所有对象移动到年老代中
3、有关年轻代jvm参数
1) -XX:NewSize和-XX:MaxNewSize
用于设置年轻代的大小,建议为整个堆大小的1/3 或是1/4,两个值设置为一样大
2)-XX:SurvivorRadio
用于设置eden和其中一个survivor的比值,这个比值也很重要
3)-XX:+PrintTenuringDistribution
这个参数用于显示每次Minor gc时Survivor去中格格年龄段的对象的大小
4)-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold
用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次minor gc之后,年龄就加一
                    
                
                
            
        
浙公网安备 33010602011771号