Java GC笔记

Java中有关GC的学习笔记

根据网上资料学习整理



前言

最近在看java有关GC的文章,所以记录一下学习笔记


一、什么是GC

Java GC(Garbage Collection,垃圾收集,垃圾回收)机制

二、GC发生在哪里?

GC发生在JVM的堆里面。

三、Jvm体系结构

在这里插入图片描述
堆是JVM所管理的最大的一块内存空间,堆主要用于存放各类的
实例对象和数组。如图所示:
在这里插入图片描述
堆是GC回收的主要区域,被分为新生代和老年代两个区域。新生代进行普通GC(Minor GC),老年代发生全局GC(Full GC)。
新生代:用来存放新创建的对象,新生代的特点是产生大量的死亡对象,并且要产生连续可用的内存空间,所以使用复制清除算法和并行收集器进行垃圾回收。
新生代又分为Eden和2个相同的幸存者区(Survivor),比例为8:1:1,,应用程序只能同时使用Eden和一个幸存者区。当发生GC时,把存活的对象复制到另外一个幸存者区域,,然后一次性清除新生代和幸存者区,将原来的非活动幸存者区标记成为活动幸存者区。将在指定次数回收后仍然存在的对象移动到老年代中,初级回收后,得到一个空的可用的新生代。对象每熬过一次GC,年龄+1,默认年龄达到15时,进去老年代。
老年代:主要存放应用程序中生命周期长的内存对象。
老年代的对象比较稳定,所以Major GC 不会频繁发生。Major GC 采用标记清除算法。

四、什么时候GC

GC又分为 minor GC 和 Full GC (也称为 Major GC )

Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件:

a.调用System.gc时,系统建议执行Full GC,但是不必然执行

b.老年代空间不足

c.方法去空间不足

d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存

e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

五、GC算法

引用计数法

引用计数法:给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器+1,当引用失效时,计数器-1。当计数器为0时,说明该对象不在被使用。
缺点:因为无法解决循环引用问题,Java中没有使用这种算法。

标记-清除 算法

标记-清除算法分为两个阶段,首先是标记阶段,这个阶段,为每个对象更新标志位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行GC操作。

缺点:产生大量的内存碎片,可能会导致后面需要大量连续内存空间无法分配。

标记整理算法

标记-整理算法是标记-清除算法的一个改进版,在清除阶段,并没有直接对死亡对象进行清除,而是将所有的活着的对象整理一下,放到另外一个空间,然后把剩余的所有对象,全部清除。
优点:避免了大量的内存碎片
缺点:如果存活对象数量较多,在复制过程可能会降低效率。

复制算法

复制算法讲内存平分为两块,每次只使用其中的一块,当这部分内存满了以后,将所有的存活的对象复制到另外一块内存中,然后清空所有对象。
优点:实现简单,效率较高,不产生内存碎片。
缺点:每次运行只使用内存的一半,导致可使用内存空间只有原来的一半,降低性能。

分代收集算法

现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代(Young)和老年代(Tenure)。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。

总结

后续更新垃圾收集器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值