谈谈你对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

相关文章
|
5天前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
8 0
|
17天前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
14 1
|
19天前
|
Java
JVM打印GC信息
JVM打印GC信息
16 1
|
25天前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
30 4
|
27天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
44 3
|
5天前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
7 0
|
1月前
|
运维 Java Shell
手工触发Full GC:JVM调优实战指南
本文是关于Java应用性能调优的指南,重点介绍了如何使用`jmap`工具手动触发Full GC。Full GC是对堆内存全面清理的过程,通常在资源紧张时进行以缓解内存压力。文章详细阐述了Full GC的概念,并提供了两种使用`jmap`触发Full GC的方法:通过`-histo:live`选项获取存活对象统计信息,或使用`-dump`选项生成堆转储文件以分析内存状态。同时,文中也提醒注意手动Full GC可能带来的性能开销,建议在生产环境中谨慎操作。
113 1
|
17天前
|
算法 Java
《JVM由浅入深学习【八】 2024-01-12》JVM由简入深学习提升分(JVM的垃圾回收算法)
《JVM由浅入深学习【八】 2024-01-12》JVM由简入深学习提升分(JVM的垃圾回收算法)
11 0
|
18天前
|
算法 Java 云计算
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
|
19天前
|
存储 算法 安全
JVM-内存划分-垃圾回收器-回收算法-双亲委派-三色标记
JVM-内存划分-垃圾回收器-回收算法-双亲委派-三色标记