【JVM】面试题-有哪些垃圾回收器
【JVM】面试题-有哪些垃圾回收器在JVM的内存管理中垃圾收集算法是内存回收的核心逻辑与方法论而垃圾收集器则是将这套方法论落地实现的具体工具。不同的垃圾收集器针对JVM堆的不同分代新生代、老年代设计具备不同的性能特点适配不同的应用场景也是JVM面试中的高频考点。 青柠来相伴代码更简单。 本文所有内容我都整理在了 青柠合集 里。 搜索关注【青柠代码录】即可查看所有合集文章 ~ 以下将详细解析7种常用垃圾收集器它们各自作用于不同的内存分代部分收集器之间可搭配使用具体分类及特点如下其中按回收范围可明确划分仅作用于新生代的收集器Serial、Parallel Scavenge、ParNew仅作用于老年代的收集器Serial Old、Parallel Old、CMS可回收整个Java堆新生代老年代的收集器G1。从垃圾收集算法的应用来看存在明确的分代适配规律新生代垃圾回收器普遍采用复制算法该算法的核心优势是执行效率高垃圾回收速度快不足则是会浪费部分内存空间需预留空闲区域用于复制老年代垃圾回收器则多采用标记-整理算法可有效避免内存碎片适配老年代对象生命周期长、占用内存大的特点。需要注意的是不同收集器之间的连线代表它们可搭配使用如Serial与Serial Old、ParNew与CMS等实际应用中需根据应用的性能需求选择合适的组合。下面逐一解析每种收集器的核心特点、采用算法及适用场景Serial收集器复制算法新生代专属的单线程垃圾收集器其标记垃圾、清除垃圾的整个过程均由单个线程完成。核心优势是实现简单、占用内存资源少在单核心CPU环境下效率较高缺点是单线程执行会导致GC期间用户线程阻塞停顿时间随内存规模增大而变长适合小型应用或单核心环境。Parallel Scavenge收集器复制算法新生代并行垃圾收集器与Serial收集器的核心区别是支持多线程并行回收。其设计目标是追求高吞吐量吞吐量的计算公式为吞吐量 用户线程运行时间 /用户线程运行时间 GC线程运行时间。高吞吐量意味着能最大限度利用CPU资源执行用户业务逻辑减少GC线程占用CPU的时间适合后台计算、批量处理等对交互响应速度要求不高的场景。ParNew收集器复制算法同样是新生代并行收集器本质上是Serial收集器的多线程优化版本。它保留了Serial收集器的核心逻辑仅将单线程回收改为多线程回收在多核CPU环境下能充分利用多核资源回收效率远高于Serial收集器常与CMS收集器搭配使用适配对响应速度有一定要求的应用。Serial Old收集器标记-整理算法老年代专属的单线程收集器是Serial收集器的老年代版本。其回收过程与Serial收集器一致均为单线程执行采用标记-整理算法能避免内存碎片。由于单线程执行的局限性它主要用于单核心CPU环境或作为CMS收集器出现异常时的备用回收方案。Parallel Old收集器标记-整理算法老年代并行收集器是Parallel Scavenge收集器的老年代配套版本。其设计目标与Parallel Scavenge一致依然以高吞吐量为核心支持多线程并行回收采用标记-整理算法适合与Parallel Scavenge收集器搭配使用构建“高吞吐量优先”的垃圾回收组合适配大型后台应用。CMSConcurrent Mark Sweep收集器标记-清除算法老年代专属的并发垃圾收集器其核心设计目标是获取最短的GC停顿时间这也是它与其他老年代收集器的核心区别。CMS收集器采用标记-清除算法核心优势是GC线程与用户线程可并发执行大幅缩短用户线程的阻塞时间具备高并发、低停顿的特点适合Web应用、桌面应用等对交互响应速度要求极高的场景缺点是会产生内存碎片且并发回收过程中会占用一定的CPU资源影响用户线程的执行效率。G1Garbage First收集器标记-整理算法一款可回收整个Java堆新生代老年代的并行垃圾收集器于JDK 1.7引入JDK 9起成为JVM默认的垃圾收集器。G1收集器基于标记-整理算法实现从根源上解决了内存碎片问题与前6种收集器最大的区别的是它打破了“分代回收”的局限将整个Java堆划分为多个大小相等的区域Region可灵活选择回收价值最高的区域实现“垃圾优先”回收。其兼顾了吞吐量与停顿时间适合内存规模较大如4GB及以上的大型应用能在控制GC停顿时间的同时保证一定的吞吐量。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607487.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!