虚拟机垃圾收集

垃圾收集

注意事项

1.进行垃圾收集时,所有的用户线程都会停止(stop all the world),所以要尽量减少垃圾收集的时间和次数。

判断对象是否存活

1.基于两种算法:引用计数算法(有很多的特殊情况需要做额外的处理)、可达性分析算法(主流的jvm都是通过此算法来判断对象是否存活的)。
2.引用计数算法:当有对象引用时,引用计数器加1,当没有对象引用时,引用计数器为0,为0是代表对象已死。
3.可达性分析算法:有一些可以作为GC root的对象,从这些对象出发,如果到一个对象之间没有引用链(不可达),认为对象已死。
4.当标记为对象需要回收时,如果没有重写对象的finalize的方法或者finalize已经执行过了,就会被直接回收,如果重写了并且没有执行过就会执行此方法,如果在方法里重新加入到引用链之中,对象就不会被回收。

垃圾收集算法(追踪式垃圾收集里的算法)

1.从判定对象死亡的角度,垃圾收集算法分为引用计数式垃圾收集和追踪式垃圾收集。
2.垃圾收集器大都基于分代收集理论进行设计,分代收集理论有三个假说:
 (1)大多数对象都是朝生夕灭的。
 (2)熬过越多次垃圾收集的对象就越难消亡。
 (3)跨带引用相对于同代引用来说占极少数。
3.根据分代理论把堆分为新生代和老年代。
4.垃圾收集分为:Minor GC(新生代垃圾收集、Major GC(老年代垃圾收集)、Full GC(整堆收集)。
5.经典的垃圾收集算法:标记-清除法、标记-复制法、标记-整理法。
6.标记-清除算法:最基础的算法,后面的算法大多是对它的缺点进行改进。对需要进行
回收的对象做标记,然后清除掉(或者是对存活对象做标记,清理掉没标记的),标记存活的还是需要清理的,取决于哪一方的对象多。缺点:导致内存空间碎片化,执行效率不稳定(大部分对象需要清除,标记和清除的效率就会下降)。
7.标记-复制算法:把新生代分为一个eden和两个survivor(8:1:1)。每次分配空间都先在在eden分配,进行回收时,会把eden和不为空的survivor中存活的对象进行标记,然后把的存活对象复制到另一个survivor中,然后清除掉eden和之前的survivor中的对象。解决了标记-清除算法的碎片化问题。
8.标记-整理算法:在标记完成之后,把存活的对象都移动到空间的另一端,把边界以外的都清除掉,解决了标记-清除算法的碎片化问题。

经典的垃圾收集器

内存分配策略(基于hotspot和serial和serial old)

1.大多数情况下,对象在eden空间里分配,eden空间不足时,会进行一次Minor GC。
2.Minor GC完,存活的对象survivor存储不下时,会转移到老年代里。
3.可以通过虚拟机设置一些参数,当对象的大小超过设置的大小的时候,会直接在老年代分配。
4.可以通过虚拟机设置一些参数,当对象的年龄(熬过GC的次数)超过设置的大小的时候,会转移到老年代。
5.当老年代的空间不足时,会进行一次 Full GC。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值