最近一直在看胖哥(谢宇)的《 java特种兵》
针对于java虚拟机有一定的感受
针对于HotSpot虚拟机,把heap分为 新生代(Young)、老年代(Old)、持久代(Perm)
当然这次我针对我看胖哥的书加上我之前看过的博客等的一些东西,简单的做一下我认为的总结
新生代:新产生的对象或者是数组,new出来的
老年代:new产生的大的对象或者是数组,以及经过Minor GC之后从Eden到S1或者是S0但是S1或者S0无法放下而放入老年代
持久代:Class以及常量
栈:局部变量
------------------------------------------------------------------------------------------
接下来说说两个GC分别是Minor GC和Full GC
Minor GC:新生代GC,新生代分为Eden 和两个Survivor区
一般新产生的对象或者是数组,都会放在Eden区当中,让Eden区达到设定的容量之后,就会发生一次Minor GC
当第一次Minor GC时,把Eden区中存活的对象放入到S0或者S1(两者任选其一),当S0或者是S1存放不下的时候就把剩下的放在老年代当中
但是一般Eden区当中存活的对象比较少。到第二次Minor GC的时候,把Eden区以及上一次所选的S0(假设当时选的是S0)中存活的对象放入S1当 中,当然如果放不下的话,就放在老年代当中。
Full GC:一般是老年代和持久代达到设定的容量时采用的,但是一般会使线程暂停,如果暂停的时间比较长,那么影响就比较大了.
******下来说说持久代的Class被卸载的条件:******
这个Class所对应的ClassLoader下所有的Class都没有或者的对象引用。
所以动态编译一段java代码进行加载,最好的方式是有单独的ClassLoader,因为当Class被替换时,原来的Class就可以被当场垃圾释放掉。
这里具体的过程我就不说了。我就说说大致过程吧。
这里一般用的是CMS(Concurrent Mark Sweep)并行标记清除,首先先标记区域里面的存活对象,然后清除掉死掉的对象之后,空间就变成了一块一块了,所以就需要把这些零散的空间集合在一起。
当然java8之后去掉了持久代,采用了G1
G1:所谓的G1就是把heap堆划分为多个相对较小而且大小相同的内存板块,这种板块叫做region