技术理论-【JVM】-02-垃圾回收器

GC核心概念

垃圾回收器是负责JVM中java堆的内存管理组件。

内存回收会产生两个问题:效率问题碎片问题
效率问题是因为JVM在垃圾回收的时候将暂停java程序运行。
碎片问题是因为垃圾回收后内存可用空间不连续。

下面的学习内容就是围绕着两个问题来展开。
在这里插入图片描述

效率问题

GC回收堆内存的时候,java线程将被暂停执行,就会造成程序卡顿现象。
虽然JVM的垃圾收集器一直在优化算法,但是目前还没法根本上解决问题。
在这里插入图片描述
从图上就能清晰的看出,java程序不是连续运行。

大白话:
打个比方,就像打扫房间,打扫的时候,必须把屋里所有人都先赶出去,打扫完了才让回来。

优化的思路:

  1. 缩短垃圾回收的时间(串行收集器Serial、ParNew、并发收集器Parallel);
  2. 垃圾回收时允许java线程并发运行(并发收集器CMS);
  3. 取消垃圾回收的暂停机制(理想收集器G1);

串行收集器Serial、ParNew、并发收集器Parallel

垃圾回收器也是一个线程程序。
最初使用的Serial串行收集器,单线程程序,效率很低。
后来CPU出现多核技术,使用了ParNew串行收集器,虽然还是单线程,但是利用了CPU的多核处理能力,提高了处理指令效率,缩短了时间。不过缺点是必须硬件支持。
最后使用了Parallel并行收集器,多线程程序,大幅缩短了回收时间。

大白话:
最开始一个人拿小扫帚;
然后换成大扫帚;
最后多喊几个人一起打扫。

优点:相对于并发收集器,能提高JVM的整体吞吐量。
缺点:必须等垃圾回收完成后,才能执行java程序,降低了程序响应效率。

并发收集器CMS

CMS(Concurrent Mark Sweep)并发收集器就是让java线程能在垃圾回收的时候交替运行。只能在老年代区域使用,由于老年代一次回收时间太长了。

大白话:
打扫房间的时候,把已经打扫的部分让人可以先使用。

优点:能提升程序的响应效率。
缺点:线程切换造成额外的CPU开销成本,降低了整体吞吐量。

理想收集器G1

理论上让JVM在垃圾回收的时候不暂停java程序是最优的,但是目前该方案还没有成熟推广。

碎片问题

垃圾回收:
首先需要找出可以回收的对象,
然后将其清除。

引用计数算法(Reference Counting)
每个对象都有一个计数器,被引用一次就+1,被抛弃就-1。
引用数为0时,就表示可以被回收。

缺点:出现循环引用的时候,出现死锁,造成无法回收。

在这里插入图片描述

通过引用计数算法和回收算法,就可以完成垃圾回收工作了。
但是从图上可以看出,回收后的未使用内存空间不连续,形成了内存碎片。

标记-清除算法(Mark-Sweep)
从根引用节点遍历一次,经过的节点都做标记;
然后第二遍将未标记节点进行清除。
可以解决循环引用问题。
在这里插入图片描述

复制算法(Copying)

准备两块一样大小的内存,将碎片都有序的复制到另外一块内存,这样就解决了内存碎片问题。
在这里插入图片描述

标记-整理算法(Mark-Compact)
先用标记-清除算法回收对象,
然后用复制算法,将存活的对象按顺序排列。
这种算法使用于单块内存,不像复制算法要准备两块内存。
在这里插入图片描述

分代算法
对象都增加一个年龄属性,每次GC作为一年,对象每经过一次GC操作,年龄就+1。
根据年龄的不同,把对象进行分区处理。
具体的过程,在后面的堆管理再讨论。

总结

  1. GC会引发“效率问题”和“碎片问题”;
  2. 效率问题是因为GC暂停应用造成的;
  3. 效率问题产生了4种垃圾收集器类型:串行、并行、并发、理想型;
  4. 碎片问题需要算法来解决,五个常用算法:引用计数、标记清除、复制、标记整理、分代。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值