面试 JVM 八股文十问十答第四期

面试 JVM 八股文十问十答第四期

作者:程序员小白条个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)简述Java垃圾回收机制

Java垃圾回收机制是一种自动管理内存的机制,它负责在程序运行时自动回收不再使用的内存空间,以便重新分配给其他需要的对象。Java中的垃圾回收机制通过标记-清除、复制、标记-整理等算法来实现。垃圾回收器会定期扫描程序中的对象,标记那些仍然被引用的对象,并清除那些没有被引用的对象,从而释放内存。

2)GC是什么?为什么要GC

GC是垃圾回收(Garbage Collection)的缩写。垃圾回收是一种自动管理内存的机制,它的目的是为了解决内存泄漏和内存溢出等问题。在程序运行过程中,当对象不再被引用时,垃圾回收机制会自动回收这些不再使用的对象所占用的内存空间,使得这些内存空间可以被重新利用。

GC的存在有以下几个原因:

  • 避免内存泄漏:当程序中的对象不再被使用时,如果没有垃圾回收机制,这些对象所占用的内存空间将无法被释放,导致内存泄漏。
  • 提高内存利用率:通过回收不再使用的内存空间,垃圾回收机制可以使得内存空间得到更有效的利用,提高内存利用率。
  • 减少程序员的负担:垃圾回收机制可以自动管理内存,减轻了程序员手动释放内存的工作量,提高了开发效率。

3)垃圾回收的优点和原理,并考虑2种回收机制

  • 自动管理内存:垃圾回收机制可以自动回收不再使用的内存空间,避免了手动释放内存的繁琐工作。
  • 避免内存泄漏:垃圾回收机制可以及时回收不再使用的对象,避免了内存泄漏问题的发生。
  • 提高内存利用率:通过回收不再使用的内存空间,垃圾回收机制可以使得内存空间得到更有效的利用,提高了内存利用率。

垃圾回收的原理可以分为两种主要的回收机制:

  • 标记-清除(Mark and Sweep):这是最基本的垃圾回收算法,它通过标记那些仍然被引用的对象,并清除那些没有被引用的对象,从而释放内存。
  • 复制(Copying):这种回收机制将内存分为两个区域,当一个区域的内存空间被使用完后,将存活的对象复制到另一个区域中,然后清除原来的区域,从而释放内存。

不同的垃圾回收器可以使用不同的回收机制,如标记-清除、复制、标记-整理等,根据具体的应用场景和需求选择合适的回收机制。

4)Java中都有哪些引用类型?

  • 强引用(Strong Reference):最常见的引用类型,只要强引用存在,垃圾回收器就不会回收该对象。
  • 软引用(Soft Reference):用于描述还有用但非必需的对象,当内存不足时,垃圾回收器会根据内存需求来决定是否回收软引用对象。
  • 弱引用(Weak Reference):用于描述非必需对象,只要垃圾回收器发现弱引用对象,就会立即回收。
  • 虚引用(Phantom Reference):用于描述即将被回收的对象,在任何时候都可能被垃圾回收器回收,主要用于跟踪对象被垃圾回收的状态。

5)怎么判断对象是否可以被回收?

  • 引用计数为0:对象没有被任何引用指向时,即引用计数为0,可以被回收。
  • 可达性分析:通过从根对象(如虚拟机栈、方法区静态变量等)出发,标记所有可达的对象,未被标记的对象即为不可达对象,可以被回收。

6)在Java中,对象什么时候可以被垃圾回收

  • 对象不再被引用:当对象没有任何强引用指向时,即没有任何变量引用该对象,垃圾回收器会将其标记为可回收对象。
  • 内存不足:当系统内存不足时,垃圾回收器会进行回收,释放不再使用的对象来腾出内存空间。
  • 手动调用System.gc():虽然调用System.gc()方法不能确保立即执行垃圾回收,但可以建议垃圾回收器执行回收操作。

需要注意的是,垃圾回收的具体时机是由垃圾回收器自行决定的,程序员不能精确控制对象何时被回收。

7)JVM中的永久代中会发生垃圾回收吗

在旧版的JVM中,永久代(Permanent Generation)是用于存放类的元数据、常量池等信息的区域,不会进行垃圾回收。然而,从JDK 8开始,永久代被元空间(Metaspace)所取代。元空间使用本地内存来存储类的元数据,不再受到永久代大小的限制,并且可以根据应用程序的需要动态调整大小。因此,永久代中不再发生垃圾回收。

8)说一下 JVM 有哪些垃圾回收算法?

  • 标记-清除算法(Mark and Sweep):标记所有活动对象,然后清除未标记的对象。
  • 复制算法(Copying):将内存分为两个区域,每次只使用其中一个区域,当一个区域的内存空间用完后,将存活的对象复制到另一个区域,并清除原来的区域。
  • 标记-整理算法(Mark and Compact):标记所有活动对象,然后将它们向一端移动,然后清除末端的内存空间。
  • 分代回收算法(Generational Collection):将内存分为不同的代,一般分为年轻代和老年代,根据对象的存活时间将其分配到不同的代中,然后针对不同代使用不同的垃圾回收算法。

9)说一下 JVM 有哪些垃圾回收器?

  • Serial收集器:使用复制算法,适用于单线程环境。
  • Parallel收集器:使用复制算法,适用于多核环境,通过多线程并行执行垃圾回收操作。
  • CMS收集器(Concurrent Mark Sweep):使用标记-清除算法,以最短停顿时间为目标,通过并发标记和并发清除来减少停顿时间。
  • G1收集器(Garbage-First):使用分代回收算法,将堆内存划分为多个区域,通过并发标记和并发清除来减少停顿时间。
  • ZGC收集器(Z Garbage Collector):使用分代回收算法,通过并发标记和并发清除来减少停顿时间,并且可以处理非常大的堆内存。

10)详细介绍一下 CMS 垃圾回收器?

CMS垃圾回收器的工作过程如下:

  1. 初始标记(Initial Mark):暂停所有应用线程,标记与根对象直接关联的对象,速度较快。
  2. 并发标记(Concurrent Mark):并发地标记所有可达对象,与应用线程同时执行,不需要停顿应用线程。
  3. 重新标记(Remark):暂停所有应用线程,标记在并发标记过程中发生变化的对象,速度较快。
  4. 并发清除(Concurrent Sweep):并发地清除未标记的对象,与应用线程同时执行,不需要停顿应用线程。

CMS垃圾回收器的优点是最短停顿时间,适用于对响应时间有要求的应用。然而,由于并发执行垃圾回收的特性,它会增加一定的CPU和内存开销,并且可能导致碎片问题。因此,在大型堆内存或长时间运行的应用中,可能需要额外的调优措施来解决这些问题。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 900+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

上一篇:基于SpringBoot和Leaflet的行政区划地图掩膜效果实战


下一篇:WebSocket:实时通信的黄金标准-IV. WebSocket在实际应用中