JVM的分区以及分区内容和GC

最近一直在看胖哥(谢宇)的《 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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值