赞
踩
1)先判断对象是否存活(是否是垃圾)
可以通过引用计数算法和可达性分析算法来判断,由于引用计数算法无法解决循环引用的问题,所以目前使用的都是可达性分析算法
2)再遍历并回收对象(回收垃圾)
可以通过垃圾收集器(Serial/Parallel/CMS/G1)来回收垃圾,垃圾收集器使用的算法标记清除算法、标记整理算法、复制回收算法和分代回收算法。
标记清除:先标记,标记完毕之后再清除,效率不高,会产生碎片
标记整理:标记完毕之后,让所有存活的对象向一端移动
复制回收:Eden区S0、S1 区比例为8:1:1 ,就是上面谈到的 YGC使用的就是复制回收算法。
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垃圾回收器
在整个垃圾回收各概念之间的关系
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。