【面试】JVM垃圾回收器

一、引出概念

垃圾回收算法是内存回收的方法理论,垃圾回收器就是内存回收的具体实现。

二、垃圾收集器

2.1 新生代垃圾回收器

2.1.1 Serial收集器

是一个单线程收集器,只会用一条垃圾收集线程去工作,并且在工作时,必须暂停其他所有的工作线程,直到它收集结束。

优点:简单高效,没有多线程交互的开销。

缺点:单线程,大量用户线程的停顿时间(用户体验效果不好)。

2.1.2 ParNew收集器

是Serial收集器的升级版,是多线程的。

优点:多线程并发,性能好。

缺点:不易管理,多线程开销。

2.1.3 Parallel Scavenge 收集器

Parallel Scavenge 收集器和ParNew收集器一样,采用多线程,Parallel Scavenge 收集器关注点是吞吐量(高效率的利用 CPU)。分为以下两种:

js 复制代码
-XX:+UseParallelGC

    使用 Parallel 收集器+ 老年代串行

-XX:+UseParallelOldGC

    使用 Parallel 收集器+ 老年代并行

JDK1.8 默认收集器

使用 java -XX:+PrintCommandLineFlags -version 命令查看

JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:+UseParallelGC 参数,则默认指定了-XX:+UseParallelOldGC,可以使用-XX:-UseParallelOldGC 来禁用该功能

2.2 老年代垃圾回收器

2.1.1 Serial Old 收集器

Serial 收集器的老年代版本,是一个单线程收集器。它主要有两大用途:一种用途是在 JDK1.5 以及以前的版本中与 Parallel Scavenge 收集器搭配使用,另一种用途是作为 CMS 收集器的后备方案。

2.1.2 Parallel Old 收集器

Parallel Scavenge 收集器的老年代版本。使用多线程和"标记-整理"算法。在注重吞吐量以及 CPU 资源的场合,都可以优先考虑 Parallel Scavenge 收集器和 Parallel Old 收集器。

2.1.3 CMS收集器

采用标记清除法,一个多线程的收集器,在回收过程中,应用线程可以不停的工作,当新的垃圾产生,CMS不会立即去回收,而是到达一个回收阀值(可通过JVM参数【-XX:CMSInitiatingoccupancyFraction】设置,默认为68,),就是老年代的空间使用率达到68%的时候,才会执行CMS回收。

如果在CMS回收过程中,出现了内存不足的情况,那么就会回收失败,此时虚拟机将会启动Serial Old收集器进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。

缺点:会产生内存碎片的问题

2.1.4 G1收集器

JDK9以后将G1变成默认的垃圾收集器,以替代CMS。

G1收集器相比传统的CMS收集器在可预测性、内存整理、停顿时间方面表现更好,特别是在大堆内存和需要低延迟的应用场景下具有更大优势。

相关推荐
Cosolar几秒前
Java 后端访问 https接口报 SSLHandshakeException 你遇到过吗
java·后端·面试
组合缺一几秒前
带来 AI Agent 开发,OpenSolon v3.8.3 发布
java·人工智能·ai·langchain·llm·solon
ghostmen1 分钟前
SpringBoot + Vue 实现 Python 在线调试器 - 技术方案文档
java·python·vue·springboot
阿蒙Amon3 分钟前
C#每日面试题-简述匿名方法
java·面试·c#
山峰哥7 分钟前
JOIN - 多表关联的魔法——3000字实战指南
java·大数据·开发语言·数据库·sql·编辑器
jghhh018 分钟前
C#中实现不同进程(EXE)间通信的方案
java·单例模式·c#
m0_748252388 分钟前
Foundation 表格的基本用法
开发语言·后端·rust
Mr.朱鹏9 分钟前
Spring Boot 配置文件加载顺序与优先级详解
java·spring boot·后端·spring·maven·配置文件·yml
m0_579146659 分钟前
Maven 编译的settings配置和pom、idea配置关系
java·maven·intellij-idea
洛阳泰山13 分钟前
一个人,一个项目,一年的坚持:关于我的 2025年 技术突围之路
java·人工智能·spring boot