2024java高频面试之JVM-第二弹

什么是 STW

Java 中「「Stop-The-World机制简称 STW」」 ,是在执行垃圾收集算法时,Java 应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。「Java 中一种全局暂停现象,全局停顿」,所有 Java 代码停止,native 代码可以执行,但不能与 JVM 交互。

为什么需要 STW

在 java 应用程序中「「引用关系」」是不断发生「「变化」」的,那么就会有会有很多种情况来导致「「垃圾标识」」出错。想想一下如果 Object a 目前是个垃圾,GC 把它标记为垃圾,但是在清除前又有其他对象指向了 Object a,那么此刻 Object a 又不是垃圾了,那么如果没有 STW 就要去无限维护这种关系来去采集正确的信息。再举个例子,到了秋天,道路上洒满了金色的落叶,环卫工人在打扫街道,却永远也无法打扫干净,因为总会有不断的落叶。

什么是安全点

从线程角度看,安全点可以理解成是在「「代码执行过程中」」的一些「「特殊位置」」,当线程执行到这些位置的时候,说明「「虚拟机当前的状态是安全」」的。

比如:「「方法调用、循环跳转、异常跳转等这些地方才会产生安全点」」。如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停所有活动线程,但是线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待 GC 结束。那么如何让线程在垃圾回收的时候都跑到最近的安全点呢?

这里有「「两种方式」」:

「抢先式中断」抢先式中断:就是在stw的时候,先让所有线程「「完全中断」」,如果中断的地方不在安全点上,然后「「再激活」」,「「直到运行到安全点的位置」」再中断。

「主动式中断」主动式中断:在安全点的位置打一个标志位,每个线程执行都去轮询这个标志位,如果为真,就在最近的安全点挂起。

常见的垃圾回收器

Serial是一个「「单线程」」的垃圾回收器,「「采用复制算法负责新生代」」的垃圾回收工作,可以与 CMS 垃圾回收器一起搭配工作。

ParNew 是一个「「多线程」」的垃圾回收器,**「采用复制算法负责新生代」的垃圾回收工作,可以与CMS垃圾回收器一起搭配工作。

Pararllel Scavenge 是一个「「多线程」」的垃圾回收器,「「采用复制算法负责新生代」」的垃圾回收工作,可以与 Serial Old , Parallel Old 垃圾回收器一起搭配工作。

CMS可以说是一款具有"跨时代"意义的垃圾回收器,支持了和用户线程一起工作,做到了
「一起并发回收垃圾」**的"壮举"。

「1.初始标记」初始标记只是标记出来「「和 GC Roots 直接关联」」的对象,整个速度是非常快的,为了保证标记的准确,这部分会在 「「STW」」 的状态下运行。

「2.并发标记」并发标记这个阶段会直接根据第一步关联的对象找到「「所有的引用」」关系,这一部分时刻用户线程「「并发运行」」的,虽然耗时较长,但是不会有很大的影响。

「3.重新标记」重新标记是为了解决第二步并发标记所导致的标错情况,这里简单举个例子:并发标记时a没有被任何对象引用,此时垃圾回收器将该对象标位垃圾,在之后的标记过程中,a又被其他对象引用了,这时候如果不进行重新标记就会发生「「误清除」」。这部分内容也是在「「STW」」的情况下去标记的。

「4.并发清除」这一步就是最后的清除阶段了,将之前「「真正确认为垃圾的对象回收」」,这部分会和用户线程一起并发执行。

更多最新最全java面试学习资料(持续更新中。。。):
https://pan.quark.cn/s/236eda5a3dc2

相关推荐
半夏之沫3 小时前
✨最新金九银十✨大厂后端面经✨
java·后端·面试
旋转的油纸伞4 小时前
大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】
算法·leetcode·面试·职场和发展·散列表
程序员yt5 小时前
2025秋招八股文--服务器篇
linux·运维·服务器·c++·后端·面试
web_code5 小时前
vite依赖预构建(源码分析)
前端·面试·vite
Algorithm15766 小时前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm
王佑辉6 小时前
【jvm】所有的线程都共享堆吗
jvm
秋恬意7 小时前
LinkedList 源码分析
java·开发语言·面试
MJH8279 小时前
Selenium自动化测试中如何处理数据驱动?
自动化测试·软件测试·功能测试·selenium·测试工具·职场和发展·单元测试
JSON_L9 小时前
面试题整理1
后端·面试·php
鱼跃鹰飞10 小时前
大厂面试真题-简单描述一下SpringBoot的启动过程
java·spring boot·后端·spring·面试