谈谈你对JVM中主要GC算法的理解,这么回答offer拿到手软

简介: 有位工作五年的小伙伴面试被问到JVM相关的问题,说请你谈谈你对JVM中主要GC算法的理解,我给大家分享一下我的理解。

有位工作五年的小伙伴面试被问到JVM相关的问题,说请你谈谈你对JVM中主要GC算法的理解,我给大家分享一下我的理解。

1 主要垃圾回收算法

GC翻译过来叫做垃圾回收,那么JVM中主要的垃圾回收算法有三种,分别是:标记清除算法、标记复制算法和标记整理算法。

ae6da86a128227ab00a80a857d19c5f4.jpg

下面,我介绍一下每种算法的核心原理:

300a232bf06ec45e266a0c525b689fbd.jpg

首先是,标记清除算法。它是将存活的对象打上标记,那么没有被标记的对象就是需要被回收的垃圾对象,这些垃圾对象会被垃圾回收器直接回收。

261de4805ca038bcbd564591fdd05109.jpg

然后是,标记复制算法。它是把内存分为两等份,每次只使用其中的一份,等到正在使用的这部分内存满了之后,就会标记出存活的对象,然后把存活的对象拷贝到另一部分闲置的内存中,那留在另一部分内存中的对象,会全部被垃圾回收器回收。那么,原来空闲的内存空间就会变成使用中的状态,而原来使用中的内存空间会被闲置出来继续使用。这就是标记复制算法的一次完整的GC。然后,一直重复这个循环。

fe03c4dab528328d92b4c24f2323c61a.jpg

最后是,标记整理算法。它是先标记出存活的对象,然后,把所有存活的对象整理到内存空间的另一端,而没有被标记的对象就是可以被覆盖或者是释放。

2 优缺点分析

接下来,分析一下三种GC算法的优缺点。

7bd2def70d654c4462a48bf9c83b27fa.jpg

首先来看,标记清除算法。它主要的缺点是会产生比较多的内存碎片,而这些内存碎片,随着系统运行时间的推移,系统运行时间长了以后,无法再大量分配连续的内存空间。这样的话,就会导致更加频繁地触发GC操作。

bd87807903d6b9439fe2d812f8a42525.jpg

然后是,标记复制算法,它主要的缺点是,会导致我们实际使用的内存空间只有50%,而另外50%的内存空间是闲置的。所以,比较浪费内存空间。而且,如果大量复制对象的话,垃圾回收的耗时就比较长了,所以,这种算法,更加适合处理存活对象少,垃圾对象比较多的场景。

e968ac610c4a14c0e49697ee345bc5a3.jpg

最后是,标记整理算法。它的本质和标记清除算法是基本差不多,只不过标记整理算法多了一个动作,会把存活的对象移动到一起。从垃圾收集和清理效率来看,增加了一个移动的动作,所以耗时会更久。但是,新分配对象的耗时就会下降。

3 分代回收

因为Java对象基本上都是临时的对象,很快就会被回收。所以,JVM的内存是分代的设计,根据对象在内存中的存活时间,分为年轻代、老年代和永久代。

d23cfe89be1449e5c713e716f2066438.jpg

那么年轻代呢,采用的是标记复制算法,在每次复制的时候,存活下来的对象会很少。


老年代呢,是经历过几次GC的对象,JVM会认为它可能继续存活下去,就不太适合采用标记复制算法,所以,老年代采用的是标记清除算法,比如CMS这种回收器就是采用标记清除的方式。


永久代呢,表示一直会存活的对象,只有在触发Full GC的时候才会被回收。所以,永久代对象创建过多的话,比较容易出现内存溢出。最典型的场景就是,在JSP页面比较多的情况,容易出现永久代内存溢出。


好了,以上就是我对垃圾回收算法的理解。


我是被编程耽误的文艺Tom,关注我,面试不再难!


image.gif

相关文章
|
22天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
45 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
4天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
22天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
37 3
|
23天前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
29天前
|
存储 算法 Java
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
43 2
|
30天前
|
缓存 算法 Java
GC垃圾收集算法
这篇文章详细讨论了垃圾收集(GC)的几种算法,包括引用计数、可达性分析、标记-清除、标记-复制和标记-整理算法,并介绍了这些算法的优缺点和适用场景。
21 0
GC垃圾收集算法
|
29天前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
46 0
|
22天前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
33 4
|
24天前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
12天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
37 10