十张图详解JVM垃圾收集机制,看完你再不会我就没办法了

JVM垃圾回收采用的是可达性分析算法:

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

从GC set中的GC roots 作为起点,从这些节点向下搜索,搜索的路径被称为引用链,如果一个对象不存在引用链的话,那么说明这个对象已死。就会被GC回收器回收。

GC roots 是

1.来自于JVM栈中引用的对象。比如各个线程中被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

2.方法区中静态属性引用的对象。比如Java中的引用类型静态变量。

3.方法区中常量引用的对象。比如字符串常量池(String Table)中的引用。

4.本地方法栈中引用的对象。

5.Java虚拟机内部的引用。比如基本数据类型对应的Class对象,一些常驻的异常类等,还有系统的类加载器。

6.所有被同步锁持有的对象。

并不是所有的引用对象一定就会被GC 的时候回收掉。

JDK1.2之后的四种引用类型:

================

1.强引用:

就是程序中一般使用的引用类型,即使发生OOM也不会回收的对象。

就是为刚被new出来的对象所加的引用,它的特点就是,永远不会被GC,除非显示的设置null,才会GC。

比如:

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

2.软引用:

就是用来描述一些还有用,但是非必须的对象,只被软引用关联着的对象,在系统将要发生OOM前会回收的对象。如果这次回收还没有足够的内存,才会抛出OOM的异常。

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

3.弱引用:

弱引用也是用来描述那些非必要的对象,它的强度比软引用还低一些。当垃圾回收器开始工作的时候,无论内存是否够用,都会回收掉只被弱引用关联着的对象。

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

4.虚引用:

它是最弱的一种引用关系。刚被创建就会被GC回收器回收。它的价值就是在GC 的时候触发一次方法的回调。

虚拟机中的并行与并发:

并行:

并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在同时的进行工作。

并发:

并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾收集器的线程和用户线程之间同时在运行。

常见的垃圾回收算法:

==========

1.标记–清除算法:(Mark–Sweep)

将死亡的对象标记,然后进行GC。

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

执行的效率不稳定。如果堆中有大量的对象,其中有大部分都是要被回收的话 ,那么必需要进行大量的标记–清除的步骤,导致执行效率的降低。

会造成内存碎片的问题,使空间的利用率降低。标记–清除之后会产生大量的不连续的内存碎片。

2.标记–复制算法:

将空间分为两部分,一部分始终是未使用的状态。当进行垃圾回收的时候。

将存活的对象复制到未使用的空间上,然后将另一半的区域进行全GC。

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

但是标记–复制算法在对象存活率比较高的时候就要进行多次的复制操作,效率会降低。而且每次只有50%的内存空间被使用。

3.标记–整理算法:

将存活的对象进行移动,然后进行GC。对象的移动需要STW,解决了垃圾碎片的问题。

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

常见的垃圾回收器:

=========

一文详解JVM垃圾收集机制,10张图帮你轻松搞定大厂面试难点

1.Serial/Serial Old收集器 是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。

2.ParNew收集器是Serial收集器的多线程版本,使用多个线程进行垃圾收集。

3.Parallel Scavenge收集器 是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。

4.Parallel Old收集器 是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。

5.CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。

6.G1收集器 是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。

新时代、老年代

=======

Java 中的堆也是 GC 收集垃圾的主要区域。GC 分为两种:Minor GC、FullGC ( 或称为 Major GC )。 Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。新生代几乎是所有 Java 对象出生的地方,即 Java 对象申请的内存以及存放都是在这个地方。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质。

当一个对象被判定为 “死亡” 的时候,GC就有责任来回收掉这部分对象的内存空间。新生代是GC收集垃圾的频繁区域。当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,再经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中。

然后清理所使用过的 Eden 以及 Survivor 区域 ( 即from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 也就是经历15次GC之后还存活的对象),这些对象就会被移动到老年代。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-5gHDvRZX-1711904322979)]

更多JVM面试整理:

[外链图片转存中…(img-tfIku4uy-1711904322979)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值