阿里二面:说说JVM的Stop the World?

简介: 此时必然触发Minor GC,有专门GC线程执行GC,且对不同内存区域有不同垃圾回收器,这相当于GC线程和垃圾回收器配合,使用自己的GC算法对指定内存区域执GC

新生代GC案例


若系统不停运行,然后把Eden给搞满:

9.png



此时必然触发Minor GC,有专门GC线程执行GC,且对不同内存区域有不同垃圾回收器,这相当于GC线程和垃圾回收器配合,使用自己的GC算法对指定内存区域执GC:

10.png



垃圾回收一定会通过一个后台运行的GC线程,如针对新生代用ParNew垃圾回收器,其针对新生代采用复制算法:标记Eden区中的存活对象,然后全部转移到Survivor1,然后一次性清空Eden中垃圾对象:


11.png

接着系统继续运行,新对象继续分配在Eden:

11.png



当Eden再满,又触发Minor GC,此时已然是GC线程运行垃圾回收器中的算法逻辑:采用复制算法逻辑,标记Eden和Survivor1中的存活对象。


然后一次性把存活对象转移到Survivor2,接着把Eden和Survivor1中的垃圾对象都回收:

12.png



GC过程中,还能创建新对象吗?


我们假设允许:


13.png


如上所示,若一边垃圾回收器在想法把Eden和Survivor2里存活对象标记出来转移到Survivor1,然后还得想法把Eden 和Survivor2里的垃圾对象都清掉,结果这时系统程还在不停往Eden创建新对象。这些新对象有的又很快成垃圾对象,现在咋办?乱套了,对程序新创建的这些对象,你怎么让垃圾回收器去持续追踪这些新对象的状态呢?


如何才能在这次GC过程中:


把新对象中的那些存活对象转移到Survivor2?


如何把新创建的对象中的垃圾都给回收?


有的同学说,那是垃圾回收器的事啊!你得好好设计!


有些事情想着很简单,但是一旦你要在JVM实现必然很复杂。所以说,在GC过程中,同时还允许我们写的Java系统继续不停的运行在Eden里持续创建新的对象,目前看很不合适。


JVM的痛点:Stop the World


因为GC时,尽可能要让垃圾回收器专心工作,不能随便让我们写的Java系统继续新建对象了,所以此时JVM会在后台直接进入“Stop the World”:停止Java系统所有工作线程,让我们写的代码无法再运行!然后让GC线程能安心执行GC:

14.png



这就能让我们的系统暂停运行,不再创建新对象,同时让GC线程尽快完成GC工作:标记和转移Eden及Survivor2的存活对象到Survivor1,然后快速地一次性回收掉Eden和Survivor2中的垃圾对象:

15.png



GC完毕,即可继续恢复Java系统的工作线程运行,继续在Eden创建新对象:

16.png



Stop the World造成的系统停顿

假设Minor GC要运行100ms,则可能导致系统直接停顿100ms,不能处理任何请求。这100ms期间用户发起的所有请求都会出现短暂卡顿,因为系统工作线程不在运行,不能处理请求。假设是Web系统,可能导致你的用户从网页或APP点击一个按钮,平时只要几十ms就可以返回响应,现在因为Web系统JVM正在执行Minor GC,暂停所有工作线程,导致你的请求过来到响应返回,这次需等待几百ms。


因为内存分配不合理,导致对象频繁进入老年代,平均7、8min一次Full GC,而Full GC最慢,有时一次回收要进行几s甚至几十s。此时一旦频繁Full GC,你的系统每隔几min就会卡死几十s。这让用户体验极差。所以无论新生代GC还是老年代GC,都尽量不能频繁,也要避免持续时间过长。


不同的垃圾回收器的不同的影响

新生代的回收,Serial垃圾回收器就是用1个线程进行垃圾回收,然后此时暂停系统工作线程,所以一般服务器程序中很少用。平时常用的新生代垃圾回收器是ParNew,其针对服务器一般都是多核CPU有优化,支持多线程GC,可大幅提升回收性能,缩短GC时间。


大致原理:

17.png



CMS也是基于多线程的,且可使用一套独特的机制尽可能的在垃圾回收的过程中减少“Stop the World”的时间,避免长时间系统卡死。


G1更是将采用复杂的回收机制将回收性能优化到机制,尽可能更多的降低“Stop the World”的时间。JVM本身迭代演进,就是不断优化垃圾回收器机制和算法,尽可能降低垃圾回收的过程对系统运行的影响。


对于我们这些 crud boy,就得合理对线程系统优化内存分配和垃圾回收,尽可能减少垃圾回收的频率,降低垃圾回收的时间,减少垃圾回收对系统运行的影响。JVM优化也就是这样。


目录
相关文章
|
6月前
|
存储 前端开发 架构师
阿里资深架构师带你深入浅出JVM!
JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)
78 1
|
6月前
|
算法 Java
太狠了!阿里技术专家撰写的电子版JVM&G1 GC实战,颠覆了传统认知
JVM是Java语言可以跨平台、保持高发展的根本,没有了 JVM, Java语言将失去运行环境。针对 Java 程序的性能优化一定不可能避免针对JVM 的调优,随着 JVM 的不断发展,我们的应对措施也在不断地跟随、变化,内存的使用逐渐变得越来越复杂。所有高级语言都需要垃圾回收机制的保护,所以 GC 就是这么重要。
|
6月前
|
运维 算法 安全
阿里P8写出的《深入理解Java虚拟机3》轻松学会JVM底层
Java是目前用户最多、使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三E方Java框架(如Spring、 MyBatis等) 构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。
|
6月前
|
网络协议 Java 关系型数据库
年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Netty+MySQL
线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、原子操作CAS 显式锁和AQS一 显式锁和AQS二 并发容器一 并发容器二 并发容器三、线程池一 线程池二、并发安全一
|
14天前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。
|
6月前
|
Arthas 架构师 Java
阿里P9级架构师马士兵花四小时让你搞懂JVM底层原理(附JVMpdf)
JVM面试难题 当面试官向你提问JVM的实战问题时,你是否感觉到无所适从? 想解决生产环境中的GC问题,你是否感觉到狗咬刺猬,无处下嘴? 面对JVM的海量参数,你是否感觉到迷茫无助? 看过很多的JVM文章,但当遇到了生产环境中真实问题的时候,你是否依然不知道如何进行分析排查?
|
6月前
|
Java 编译器 开发者
旁边的同事突然晋升阿里P7,只因偷偷学习了这份JVM笔记?
大家都是有经验的Java开发人员,想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因,总之你得先学好。那怎么学好呢?
|
6月前
|
架构师 Java 测试技术
阿里架构师的床头文案:深入理解Java虚拟机的权威指南PDF
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。
|
11月前
|
存储 架构师 算法
收下我的膝盖!阿里架构师编写的668页Java虚拟机笔记真强
从Java诞生至今已有二十余年,基于虚拟机的技术屏蔽了底层环境的差异,一次编译,随处运行的思想促进了整个IT上层技术应用产生了翻天覆地的变化。Java作为服务端应用语言的首选,确实大大降低了学习和应用的门槛。
|
12月前
|
算法 架构师 Java
阿里P8架构师爆肝分享内部开源的JVM垃圾回收PDF文档,共23.3W字
说在前面 本文讲解的内容是关于垃圾回收(Garbage Collection,GC)的文档 ,为什么要写关于垃圾回收的文档呢? 首先,垃圾回收对应用影响很大,主要表现在应用停顿时间、吞吐量、资源使用等方面,开发者选择一种语言时考虑的一个重要因素就是该语言是否支持垃圾回收以及支持哪些垃圾回收实现(要综合考虑开发难度、效率和运行效率)。 其次,Hotspot是最流行的Java虚拟机(Java Virtual Machine,JVM。 本文使用JVM指代Hotspot虚拟机),垃圾回收是Java虚拟机最重要的组成部分,也是最复杂的部分之一。以JDK 8为例,共计支持5种垃圾回收实现,提供了超过
88 0