谈一谈JVM的GC(垃圾回收)

19 篇文章 0 订阅
8 篇文章 0 订阅

JVM(Java Virtual Machine)的GC(Garbage Collection,垃圾回收)是Java语言的一个重要特性,它负责自动管理内存,释放那些不再被使用的对象所占用的内存空间。以下是对JVM GC的详细介绍:

  1. GC的基本概念
    定义:GC即垃圾回收,是指JVM用于释放那些不再被使用的对象所占用的内存。
    目的:清除不再使用的对象,防止内存泄漏,提高内存利用率。
  2. GC的工作原理
    JVM通过两种主要方法来识别垃圾对象:

引用计数:虽然这种方法简单有效,但存在循环引用的问题,因此在现代JVM中较少使用。
可达性分析:JVM使用的主流方法。以根集合(如栈上的局部变量、静态变量等)为起点,通过引用链遍历对象图,所有可达的对象都被视为存活对象,其余则为垃圾对象。

  1. GC算法

主要垃圾回收算法有3种,分别是标记清除算法、标记复制算法、标记整理算法。

(1)标记清除算法:算法核心原理,它会给所有存活对象打上标记,那么没有被标记的对象,就是需要被回收的垃圾对象,这些垃圾对象会被垃圾回收器直接回收。这种算法会产生比较多的内存碎片,而且这些内存碎片,会随着系统运行时间的增长,出现无法分配空间或连续的内存空间,会导致更加频繁的GC操作。另外这种方式清理出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表。
在这里插入图片描述

(2)标记复制算法:它把内存分为两等份,每次只需要使用其中的一份,等到正在使用的这份存满之后,它就会标记出存活的对象,然后再把现在存活的对象,拷贝到另外一份闲置的内存中,被留在原来那块内存中的对象,就会全部被垃圾回收器回收。原来闲置的那个内存空间就会变成正在使用的状态。原来使用的那块内存经垃圾回收后,就变成闲置的内存等待继续使用。这就是标记复制算法一次完整的垃圾回收过程。标记复制算法会一直重复这个循环。这种算法实际使用的内存只占50%,另外50%是闲置的,比较浪费内存空间。如果存在大量复制对象,垃圾回收的耗时会比较长。这种算法更适合处理一些活动对象比较少,垃圾对象比较多的场景,所以适用于新生代(速度快,效率高)。
在这里插入图片描述

(3)标记整理算法:它先标记出存活的对象,然后把所有的存活对象,整理到内存的另外一端,没有被标记的对象就是可以被覆盖,或是被释放。这样就解决了空间碎片化问题,但从垃圾收集和清理效率来看,增加了一个移动的动作,所以耗时会更久。此算法适合老年代。
在这里插入图片描述

  1. 分代收集(Generational Collection)

因为 Java 对象基本上都是临时的对象,很快就会被回收,所以JVM 的内存是分代设计的,根据对象在内存中的存活时间,分为年轻代、老年代、永久代。年轻代采用的是标记复制算法,在每次复制的时候,存活下来的对象会很少。而老年代是经历过几次GC的对象,JVM 会认为它可能会继续存活下去,不大适合去采用标记复制算法,所以老年代采用的是标记清除算法或标记-整理算法。比如说CMS这种回收器,采用的就是标记清除的方式。那么永久代是一直会是存活的对象,只有在触发 Full GC 的时候,才会被回收。所以永久代的对象创建过多的话,会比较容易出现内存溢出。最典型的场景是在 JSP 页面比较多的情况下,容易出现永久代的内存溢出。

  1. JVM中的GC收集器
    JVM提供了多种GC收集器,每种收集器都有其特定的应用场景和优缺点。常见的收集器包括:

Serial GC:单线程执行GC,适用于单核CPU、新生代空间较小及对暂停时间要求不高的应用。
Parallel GC:多线程执行GC,适用于多核CPU、对吞吐量有高要求的应用。
CMS(Concurrent Mark Sweep)GC:一种以最短回收停顿时间为目标的收集器,适用于对响应时间敏感的应用。但它在并发收集时会产生浮动垃圾,且需要预留一定的空间来避免频繁的全堆GC。
G1(Garbage-First)GC:面向服务端应用的垃圾收集器,它设计用来满足在堆内存不断增大的情况下,减少停顿时间的需求。G1收集器将堆划分为多个大小相等的独立区域(Region),并优先收集垃圾最多的区域。

  1. GC对JVM内存的影响
    GC主要影响JVM中的堆内存区域。堆内存被划分为新生代和老年代,GC在这两个区域中分别采用不同的算法进行回收。GC的执行会导致应用程序的暂停(Stop-The-World),但现代JVM通过优化算法和收集器,已经大大减少了这种暂停的时间。

总之,JVM的GC是Java语言内存管理的重要机制,它通过自动化的方式释放不再使用的内存空间,提高了程序的稳定性和可靠性。同时,JVM提供了多种GC算法和收集器,以满足不同应用场景的需求。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是几个 JVM 垃圾回收相关的面试题及其答案: 1. 什么是垃圾回收垃圾回收是指在程序运行过程中,自动回收不再使用的内存空间,以提高内存利用率和程序的性能。 2. JVM垃圾回收机制是什么? JVM垃圾回收机制采用分代收集算法,将内存分为新生代和老年代,分别采用不同的垃圾回收算法来回收内存。 3. 新生代垃圾回收器有哪些? 新生代垃圾回收器主要有 Serial、ParNew、Parallel Scavenge 等。 4. 老年代垃圾回收器有哪些? 老年代垃圾回收器主要有 Serial Old、Parallel Old、CMS、G1 等。 5. 什么是对象的引用计数算法? 引用计数算法是一种简单的垃圾回收算法,它通过记录每个对象被引用的次数,当引用次数为 0 时,即可将该对象回收。 6. 引用计数算法的缺点是什么? 引用计数算法的缺点是无法处理循环引用的情况,如果两个对象之间相互引用,它们的引用计数会一直不为 0,导致无法回收。 7. 什么是标记-清除算法? 标记-清除算法是一种常见的垃圾回收算法,它将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段,标记所有活跃对象,将其打上标记;在清除阶段,清除所有未标记的对象。 8. 标记-清除算法的缺点是什么? 标记-清除算法的缺点是会产生大量的内存碎片,会导致内存利用率降低。 以上是一些常见的 JVM 垃圾回收面试题及其答案,希望能对你有所帮助。在面试过程中,需要根据具体的问题进行回答,同时也需要对垃圾回收机制和算法有清晰的认识,才能更好地回答相关的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值