JVM年轻代、年老代、永久代
2017-04-08 15:19
197 查看
年轻代:
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫From和To),每次新创建对象时,都会分配到Eden区,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC 。这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区“From”,在Minor GC开始时,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的,然后开始进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为“To”的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有此时还存活的对象移动到年老代中。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象
永久带:
存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收。在jdk1.8之前,通过-XX:PermSize=64m -XX:MaxPermSize=128m来调整永久代大小,在jdk1.8之后,永久代被移除,原本存储在永久代的数据将存放在一个叫做元空间的本地内存区域,通过 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m来调整元空间大小
注:
大对象(需要大量连续内存空间的java对象,比如很长的字符串or数组)会直接分配在老年代
反射、动态代理、CGLib消耗的是jvm永久代(jdk1.8之后是元空间)的内存
Full gc触发条件:
1、程序调用System.gc()
2、老年代空间不足、永久代(jdk8之后不存在永久代)空间不足
3、CMS GC时出现promotion failed和concurrent mode failure,对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足触发Full GC)。应对措施为:增大survivor space、老年代空间或调低触发并发GC的比率
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫From和To),每次新创建对象时,都会分配到Eden区,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC 。这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区“From”,在Minor GC开始时,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的,然后开始进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为“To”的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有此时还存活的对象移动到年老代中。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象
永久带:
存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收。在jdk1.8之前,通过-XX:PermSize=64m -XX:MaxPermSize=128m来调整永久代大小,在jdk1.8之后,永久代被移除,原本存储在永久代的数据将存放在一个叫做元空间的本地内存区域,通过 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m来调整元空间大小
注:
大对象(需要大量连续内存空间的java对象,比如很长的字符串or数组)会直接分配在老年代
反射、动态代理、CGLib消耗的是jvm永久代(jdk1.8之后是元空间)的内存
Full gc触发条件:
1、程序调用System.gc()
2、老年代空间不足、永久代(jdk8之后不存在永久代)空间不足
3、CMS GC时出现promotion failed和concurrent mode failure,对于采用CMS进行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足触发Full GC)。应对措施为:增大survivor space、老年代空间或调低触发并发GC的比率
相关文章推荐
- jvm 年轻代、年老代、永久代
- JVM垃圾回收--年轻代、年老点和持久代
- JVM 年轻代和年老代 大小设置
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
- JVM内存:年轻代,老年代,永久代
- JVM 年轻代和年老代 大小设置
- JVM内存:年轻代、老年代、永久代
- JVM垃圾回收--年轻代、年老点和持久代
- 对这个java虚拟机内存的,年轻代,年老代,永久代i,搞不太清楚。年轻代、年老代存放在堆还是栈。新版虚拟机没有永久代是个啥情况
- jvm 年轻代、年老代、持久代
- JVM垃圾回收--年轻代、年老点和持久代
- jvm参数(调优)+jvm内存的年轻代/老年代/持久代
- JVM之永久区Permanent区参数设置分析
- jvm 年老代回收过程
- JVM进阶(十)——JAVA 年老代收集器
- JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC
- 聊聊JVM的年轻代
- 对JVM中垃圾回收机制的个人理解--新生代,老年代,永久代
- jvm系列二:Java8内存模型-永久代(PermGen)和元空间(Metaspace)
- 聊聊JVM的年轻代