文章目录

  • 简介
  • GC的垃圾回收器
  • 分代回收器中的问题
  • safepoints
  • safepoint一般用在什么地方
  • 总结

简介

java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为删除的对象从堆空间释放,以提升可用的堆空间。今天我们会来探讨一下隐藏在GC背后的一个小秘密Safepoints。

GC的垃圾回收器

小师妹:F师兄,GC的垃圾回收器的种类为什么会有这么多呀?使用起来不是很麻烦。并且我听说CMS在JDK9zhong已经被废弃了。

小师妹,这么多垃圾回收器实际是在JVM的发展过程中建立起来的,在之前的文章中,我们讲到了目前的GC回收器有这样几种。

  1. 基于分代技术的回收器

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区域。

  1. 非基于分代技术的回收器

Z Garbage Collection,ZGC是一个可扩展的,低延迟的GC。ZGC是并发的,而且不需要停止正在运行的线程。

ZGC是在JDK11中引入的。

当然还有正在研发中的其他GC。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

分代回收器中的问题

小师妹: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的例子:

@Benchmarkpublic 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相关推荐

  1. 小师妹学JavaIO之:NIO中那些奇怪的Buffer

    文章目录 简介 Buffer的分类 Big Endian 和 Little Endian aligned内存对齐 总结 简介 妖魔鬼怪快快显形,今天F师兄帮助小师妹来斩妖除魔啦,什么BufferB,B ...

  2. 小师妹学JavaIO之:NIO中Channel的妙用

    文章目录 简介 Channel的分类 FileChannel Selector和Channel DatagramChannel SocketChannel ServerSocketChannel As ...

  3. 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列

    文章目录 简介 JIT编译器 Tiered Compilation分层编译 OSR(On-Stack Replacement) Deoptimization 常见的编译优化举例 Inlining内联 ...

  4. 小师妹学IO系列文章集合-附PDF下载

    文章目录 第一章 IO的本质 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 第二章 try with和它的底层原理 简介 IO关闭的问题 使用try with resourc ...

  5. 小师妹学JavaIO之:文件读取那些事

    文章目录 简介 字符和字节 按字符读取的方式 按字节读取的方式 寻找出错的行数 总结 简介 小师妹最新对java IO中的reader和stream产生了一点点困惑,不知道到底该用哪一个才对,怎么读取 ...

  6. 小师妹学JavaIO之:文件系统和WatchService

    文章目录 简介 监控的痛点 WatchService和文件系统 WatchSerice的使用和实现本质 总结 简介 小师妹这次遇到了监控文件变化的问题,F师兄给小师妹介绍了JDK7 nio中引入的Wa ...

  7. 小师妹学JVM之:JIT中的PrintAssembly

    文章目录 简介 使用PrintAssembly 输出过滤 总结 简介 想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升? 如果你 ...

  8. 小师妹学JVM之:JIT中的PrintAssembly续集

    文章目录 简介 JDK8和JDK14中的PrintAssembly JDK8中使用Assembly JDK14中的Assembly 在JMH中使用Assembly 总结 简介 上篇文章和小师妹一起介绍 ...

  9. 小师妹学JVM之:JIT中的PrintCompilation

    文章目录 简介 PrintCompilation 分析PrintCompilation的结果 总结 简介 上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件 ...

最新文章

  1. php insert into values 可以是数组吗,PHP INSERT INTO插入不了数据有关问题
  2. Linux云自动化运维第十课
  3. CF 2B The least round way DP+Math
  4. u2net encode
  5. 菜鸟自学数据结构系列——(一)如何写出能够在VC下运行的单链表生成程序
  6. 前端模块化(一):模块化那些事儿
  7. dw_mysql】apache_怎么将dreamweaver与apache服务器连接
  8. Win7中修改Chrome浏览器缓存文件目录
  9. MFC VS2012对话框背景填图
  10. C语言试题三十六之将s所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。
  11. 替换WordPress调用的Google前端库为360镜像的库
  12. 看看ConcurrentLinkedQueue源码 in Java 9
  13. 【转载】我的MYSQL学习心得-系列
  14. 入门神经网络优化算法(五):一文看懂二阶优化算法Natural Gradient Descent(Fisher Information)
  15. 智齿徐懿 | 一个“外行”眼中的呼叫中心系统未来
  16. cai鸡——处女作博客“横空出世”
  17. 从键盘上输入两个字符串,将两个字符串首尾相连接后,再输出新的字符串(c语言)
  18. python之有关魔方方法的内容
  19. java回收策略_Java 中的垃圾回收策略
  20. single-row subquery returns more than one row

热门文章

  1. CanvasRenderingContext2D(渲染上下文对象)
  2. 正方形个数(二维点哈希)
  3. 素数与线性筛选法初级版
  4. C语言实现缓冲区溢出实例
  5. docker学习笔记(七)docker-swarm
  6. 程序员35岁破局之路
  7. URL2Video:把网页自动创建为短视频
  8. 符乐安:2020年短视频创作将迎来新的高峰
  9. JVM之XX参数详解
  10. 服务器开发设计之算法宝典