Java垃圾回收机制GC完全指南,让你彻底理解JVM运行原理

1、GC过程

1)先判断对象是否存活(是否是垃圾)

可以通过引用计数算法和可达性分析算法来判断,由于引用计数算法无法解决循环引用的问题,所以目前使用的都是可达性分析算法

2)再遍历并回收对象(回收垃圾)

可以通过垃圾收集器(Serial/Parallel/CMS/G1)来回收垃圾,垃圾收集器使用的算法标记清除算法、标记整理算法、复制回收算法和分代回收算法。

2、GC种类

3、GC收集方法

标记清除:先标记,标记完毕之后再清除,效率不高,会产生碎片

标记整理:标记完毕之后,让所有存活的对象向一端移动

复制回收:Eden区S0、S1 区比例为8:1:1 ,就是上面谈到的 YGC使用的就是复制回收算法。

4、GC收集器

4.1 几种收集器

1)Serial收集器

一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。

特点:CPU利用率最高,停顿时间即用户等待时间比较长。

适用场景:小型应用

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2)Parallel收集器(jdk8默认收集器)

采用多线程来通过扫描并压缩堆

特点:停顿时间短,回收效率高,对吞吐量要求高。

适用场景:大型应用,科学计算,大规模数据采集等。

通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

3)CMS收集器

采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。

(1)初始标记

(2)并发标记

(3)并发预处理

(4)重新标记

(5)并发清除

(6)并发重置

特点:响应时间优先,减少垃圾收集停顿时间

适应场景:服务器、电信领域等。

通过JVM参数 -XX:+UseConcMarkSweepGC设置

4)G1收集器(jdk17默认收集器)

在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。

特点:支持很大的堆,高吞吐量

--支持多CPU和垃圾回收线程

--在主线程暂停的情况下,使用并行收集

--在主线程运行的情况下,使用并发收集

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

4.2 几种收集器对比

5、GC小结

在整个垃圾回收各概念之间的关系

  • GC收集器核心是GC收集算法
  • GC收集算法一般先要判断对象是否存活就会用到引用计数算法或可达性分析算法
  • 引用计数算法解决不了循环引用的情况,所以目前使用的都是可达性分析算法
  • GC分为4个种类,作用在内存的不同区域(新生代Eden/S0/S1、老年代)。这时GC收集器会相互组合完成不同种类的GC,从而达到JVM GC的功能

6、相关问题

Java GC是一种自动内存管理机制,用于检测和清除不再使用的对象。它的主要作用是释放内存空间以供程序继续使用。

2. 在Java中有哪些不同类型的GC算法?

在Java中有几种不同类型的GC算法,包括标记-清除、复制、标记-整理、分代算法和增量垃圾收集器等。

3. 请解释什么是Minor GC和Major GC,以及它们之间的区别。

Minor GC用于清除新生代存活的对象,而Major GC用于清除老年代存活的对象。Minor GC通常比Major GC更频繁,而且速度也更快。

4. 堆是什么?在Java中如何管理堆?

堆是Java运行时数据区域之一,用于存储对象实例。在Java中,可以通过设置-Xmx和-Xms参数来控制堆的大小,从而管理堆。

5. 什么是垃圾收集器?在Java中有哪些不同类型的垃圾收集器?

垃圾收集器负责执行垃圾回收操作。在Java中,有几种不同类型的垃圾收集器,包括串行收集器、并行收集器、CMS收集器和G1收集器等。

6. 描述垃圾收集过程。当垃圾收集器运行时会发生什么?

在垃圾收集期间,垃圾收集器会扫描堆内存中的对象,并标记出所有不再使用的对象。然后,它将这些对象从堆中删除,以释放内存空间。

7. 为什么需要避免频繁的垃圾收集?

频繁进行垃圾收集会导致程序性能下降,因为垃圾收集器需要占用CPU时间和内存资源。此外,频繁的垃圾收集还会导致应用程序出现延迟或停顿。

8. 如何使用Java代码手动触发GC?

在Java中,可以使用System类的gc()方法手动触发GC。但需要注意的是,调用该方法并不保证会立即进行垃圾回收,因为Java的垃圾回收机制是由JVM自动管理的。

9. 描述分代垃圾收集算法。在Java中为什么使用分代垃圾收集?

分代垃圾收集算法将堆划分为新生代和老年代,根据对象的特性选择不同的垃圾收集方式。在Java中使用分代垃圾收集可以提高垃圾收集的效率,因为大部分对象都是短暂的,只存在于新生代中。

10. 如何优化GC性能?在进行调整时需要注意什么?

可以通过调整堆大小、设置垃圾收集器和调整垃圾收集器参数等方法来优化GC性能。在进行调整时需要注意不能过度调整,否则会导致性能下降或应用程序出现异常。


最后推荐一下文章中作图工具:

​​​​​​​

​​​​​​​

ProcessOnhttps://www.processon.com/i/5b100cd0e4b06350d44a08ac?full_name=%E7%8E%84%E6%98%8EHanko

猜你喜欢

转载自blog.csdn.net/citywu123/article/details/130114512