JVM中的老生代与新生代
JVM示意图 内存示意图堆=新生代 + 老生代,其中新生代等于1/3的堆空间大小,老生代等于2/3堆空间的大小
新生代被细分为Eden和Survivor两个局域,由一个Eden和两个Survivor组成,这两个Survivor分别被命名为from和to,三块空间的比例为8:1:1。JVM每次只会使用Eden和其中一块Survivor来使用,还有一个Survivor是空闲的。因此,新生代中每次都有90%的空间会被使用
在老生代中采用的GC算法是标记-清除算法(Full-GC),新生代中采用的是复制算法( Minor GC )。新生代是GC比较频繁的地方
所谓的新生代和老生代是以垃圾回收算法来定义的。数据首先会被分配到Eden中(当然,也有特殊情况。比如需要大量内存的对象,如数组),当Eden没有空间是就会触发一次Minor GC。如果一个对象经过一次Minor GC还能存活,而且又能被Survivor所接受,那么就会移动到Survivor空间。并且年龄会被设置为1,对象在Survivor中每熬过一次Minor GC,年龄就加一,当年龄到达一定的程度时就会进入老生代(一般是15),当然晋升老生代的年龄也是可以设置的。
Full GC发生的次数不会有Minor GC频繁,并且一次Full GC要比Minor要久
每次调用System.gc(),是先Minor GC,然后在Full GC。当Full GC进行时,默认的方式是先尽量清空新生代,因此在调用System.gc()时,新生代中的对象会提前进入老生代。
为什么要分代
大多数对象在创建后就很少使用了
大多数经常使用的对象很少再去引用新创建的对象
新生代的特点
绝大多数对象存储在这个区域
此区域一般来说比较小而且垃圾回收比较频繁
采用的算法和存放对象的特点使得该区域JVM垃圾回收的效率也特别高
老生代的特点
是在新生代存活了较长时间之后转移过来的
区域一般比较大,而且增长速度比较慢
垃圾回收执行频率比较低
永久代
用于存储类的元数据。所谓元数据就是用来定义数据的数据。其中有Java类,方法,静态文件等等、
网友评论