《Java深入理解虚拟机》笔记一

JVM中的老生代与新生代


《Java深入理解虚拟机》笔记一_第1张图片
JVM示意图


《Java深入理解虚拟机》笔记一_第2张图片
内存示意图

堆=新生代 + 老生代,其中新生代等于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类,方法,静态文件等等、

你可能感兴趣的:(《Java深入理解虚拟机》笔记一)