美文网首页
《Java深入理解虚拟机》笔记一

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

作者: 梅子酒z_Z | 来源:发表于2018-01-02 19:42 被阅读0次

    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类,方法,静态文件等等、

    相关文章

      网友评论

          本文标题:《Java深入理解虚拟机》笔记一

          本文链接:https://www.haomeiwen.com/subject/nuyqnxtx.html