小师妹学JVM之:JVM中的Safepoints
简介
java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为删除的对象从堆空间释放,以提升可用的堆空间。今天我们会来探讨一下隐藏在GC背后的一个小秘密Safepoints。
GC的垃圾回收器
小师妹:F师兄,GC的垃圾回收器的种类为什么会有这么多呀?使用起来不是很麻烦。并且我听说CMS在JDK9zhong已经被废弃了。
小师妹,这么多垃圾回收器实际是在JVM的发展过程中建立起来的,在之前的文章中,我们讲到了目前的GC回收器有这样几种。
- 基于分代技术的回收器
Concurrent mark sweep (CMS) ,CMS是mark and swap的升级版本,它使用多个线程来对heap区域进行扫描,从而提升效率。
由于CMS的参数复杂性和性能问题,CMS已经在JDK9中被废弃了。
Serial garbage collection,使用单一的线程来进行垃圾回收操作,其好处就是不需要和其他的线程进行交互。如果你是单核的CPU,那么最好就是选择Serial garbage collection,因为你不能充分利用多核的好处。同样的它也常常用在比较小型的项目中。
Parallel garbage collection,如果你是多核处理器,那么Parallel GC可能是你的选择。
Parallel GC是JDK8中的默认GC。而在JDK9之后, G1是默认的GC。
G1 garbage collection,G1=Garbage First,它是为替换CMS而生的,最早出现在java7中。
G1将heap区域划分成为多个更小的区域,每个小区域都被标记成为young generation 或者old generation。从而运行GC在更小的范围里运行,而不是影响整个heap区域。
- 非基于分代技术的回收器
Z Garbage Collection,ZGC是一个可扩展的,低延迟的GC。ZGC是并发的,而且不需要停止正在运行的线程。
ZGC是在JDK11中引入的。
当然还有正在研发中的其他GC。
分代回收器中的问题
小师妹:F师兄,分代回收器不好吗?为什么还有新的ZGC等基于非分代技术的回收器?
分代垃圾回收器中有一个非常常见的现象就是"Stop The World"。什么是Stop the world呢?
就是说在GC的时候,为了进行垃圾回收,需要所有的线程都要暂停执行。所有的线程都暂停执行。
当然G1虽然是基于分代技术,但是G1实际上是不会"Stop The World"的。
JVM定义了一些Root对象,从这些对象开始,找出他们引用的对象,组成一个对象图。所有在这个图里面的对象都是有效的对象,反之不在对象图中的对象就应该被回收。有效的对象将会被Mark为alive。
这些Root对象包括:正在执行的方法中的本地对象和输入参数。活动的线程,加载类中的static字段和JNI引用。
safepoints
为了实现STW的功能,JVM需要提供一个机制,让所有的线程可以在某一个时刻同时停下来。这个停下来的时刻就叫做safepoints。
注意,这些停下来的线程不包括运行native code的线程。因为这些线程是不属于JVM管理的。
JVM中的代码执行其实有两种方式,一种是JIT编译成为机器码,一种是解释执行。
在JIT中,直接将检查代码编译进入了机器码中。通过设置相应的标记位,从而在线程运行的过程中执行暂停的指令。
还是举一个上篇文章中我们提到的JMH的例子:
@Benchmark
public void test1() {
int length = array.length;
for (int i = 0; i < length; i=i+1)
array[i] ++;
}
我们看一下它的assembly code:

可以看到其中有个test的指令,这个test指令就是生成的safe points。
通过设置标志位,就可以在线程运行时执行暂停操作。
如果是解释执行的话,JVM保存了两个字节码的调度table,当需要safepoint的时候,JVM就进行table的切换,从而开启safepoint。
safepoint一般用在什么地方
一般情况下,GC,JIT的反代码优化,刷新code cache,类重定义 ,偏向锁撤销和其他的一些debug操作。
我们可以通过使用-XX:+PrintGCApplicationStoppedTime来print safepints的暂停时间。
-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1这两个参数可以强制JVM打印safepoint的一些统计信息。
总结
Safepoint是垃圾回收中一个非常重要的概念,希望大家能够有所了解。
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jvm-jit-safepoints/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
小师妹学JVM之:JVM中的Safepoints的更多相关文章
- 小师妹学JavaIO之:NIO中那些奇怪的Buffer
目录 简介 Buffer的分类 Big Endian 和 Little Endian aligned内存对齐 总结 简介 妖魔鬼怪快快显形,今天F师兄帮助小师妹来斩妖除魔啦,什么BufferB,Buf ...
- 小师妹学JavaIO之:NIO中Channel的妙用
目录 简介 Channel的分类 FileChannel Selector和Channel DatagramChannel SocketChannel ServerSocketChannel Asyn ...
- 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
目录 简介 JIT编译器 Tiered Compilation分层编译 OSR(On-Stack Replacement) Deoptimization 常见的编译优化举例 Inlining内联 Br ...
- 小师妹学IO系列文章集合-附PDF下载
目录 第一章 IO的本质 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 第二章 try with和它的底层原理 简介 IO关闭的问题 使用try with resource ...
- 小师妹学JavaIO之:文件系统和WatchService
目录 简介 监控的痛点 WatchService和文件系统 WatchSerice的使用和实现本质 总结 简介 小师妹这次遇到了监控文件变化的问题,F师兄给小师妹介绍了JDK7 nio中引入的Watc ...
- 小师妹学JVM之:JIT中的PrintAssembly
目录 简介 使用PrintAssembly 输出过滤 总结 简介 想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升? 如果你的回 ...
- 小师妹学JVM之:JDK14中JVM的性能优化
目录 简介 String压缩 分层编译(Tiered Compilation) Code Cache分层 新的JIT编译器Graal 前置编译 压缩对象指针 Zero-Based 压缩指针 Escap ...
- 小师妹学JVM之:JIT中的LogCompilation
目录 简介 LogCompilation简介 LogCompilation的使用 解析LogCompilation文件 总结 简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能.那么 ...
- 小师妹学JVM之:JIT中的PrintCompilation
目录 简介 PrintCompilation 分析PrintCompilation的结果 总结 简介 上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面 ...
- 小师妹学JVM之:JIT中的PrintAssembly续集
目录 简介 JDK8和JDK14中的PrintAssembly JDK8中使用Assembly JDK14中的Assembly 在JMH中使用Assembly 总结 简介 上篇文章和小师妹一起介绍了P ...
随机推荐
- github常用的协同开发流程
github的实用之处 对于刚刚工作的小白来说,顺利完成工作任务是首要考虑的事情,业余时间多了解了解其他的技术将有利于自己对该领域的熟悉,比如我们都拥有的github,除了在网站里查看优秀的代码,其还 ...
- 用struts的action运行jsp页面
struts是开源框架.使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间.如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的 ...
- 简述hadoop安装步骤
简述hadoop安装步骤 安装步骤: 1.安装虚拟机系统,并进行准备工作(可安装- 一个然后克隆) 2.修改各个虚拟机的hostname和host 3.创建用户组和用户 4.配置虚拟机网络,使虚拟机系 ...
- <Win10开发>一些小知识。
这篇文章分享一下UWP开发的一些零散的小知识. 1.设置应用的最小尺寸 主要用在PC上,UWA在PC可以被鼠标随意摆弄,可大可小,界面的响应式设计是一大特点.不过有些时候还是要考虑,我们的App界面元 ...
- [转] Git caret(^) and tilde(~)
点击阅读原文 I spent a little bit of time playing with Git today, specifically the way that the ^ (caret) ...
- (四)Parameters,简单参数就用这个
Parameters注解在测试方法上指定参数列表,然后在测试方法中声明对应的形参,形参与参数列表一一对应,但名字可以不同,如下所示: public class Test1 { @Parameters( ...
- Win10 1903小白搭建Redis
一.Redis介绍 Please Baidu. 二.安装 1)下载: 下载网址 https://github.com/microsoftarchive/redis/releases 选这个 2)安装 ...
- Andrew Ng - 深度学习工程师 - Part 1. 神经网络和深度学习(Week 2. 神经网络基础)
=================第2周 神经网络基础=============== ===2.1 二分分类=== ===2.2 logistic 回归=== It turns out, whe ...
- 基于领域驱动设计(DDD)超轻量级快速开发架构
smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...
- InnoDB 中 B+ 树索引的分裂
数据库中B+树索引的分裂并不总是从页的中间记录开始,这样可能会导致空间的浪费,例如下面的记录: 1, 2, 3, 4, 5, 6, 7, 8, 9 插入式根据自增顺序进行的,若这时插入10这条记录后需 ...