文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JVM中怎么做到STW使程序暂停

2023-06-28 23:49

关注

这篇文章跟大家分析一下“JVM中怎么做到STW使程序暂停”。内容详细易懂,对“JVM中怎么做到STW使程序暂停”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“JVM中怎么做到STW使程序暂停”的知识吧。

STW

JVM中要做到STW是很难的。为什么这么说呢?因为需要考虑很多很多因素。

一、JVM中存在多种类型的会发生改变内存行为的线程:

二、每种类型的线程个数,在需要STW的那一刻,可能都不止一个。

三、每种类型的线程,在需要STW的那一刻,执行到的代码位置也未可知。

四、每种类型的线程阻塞的点还不能随机。因为线程在阻塞前需要更新OopMap。

OopMap是什么?你可以理解成是记录这个线程一路跑下来经历过的所有Java对象的集合。为什么要有OopMap呢?因为没有的话,你就得扫描整个栈,去查找根对象。

这里说的只是查找根对象的一种情况哈,勿抬杆,我会记仇。^_^

如何暂停线程

听我这么一分析,好像确实很复杂哈。那如果是你来实现,你会怎么解决呢?小伙伴门可以想一想。经常想这样有深度的问题,有利于提高你的思考深度。

我们还是来看看JVM是如何高明地解决的吧。

如果线程随便哪个位置阻塞都合适,这个问题就会简单一百倍。但是这里简单了,给其他地方就带来了灾难。就是说线程阻塞前需要更新OopMap,如果不更新,没有这个数据的话,GC时就需要扫描所有线程的所有栈的所有栈帧来查找根对象。

OopMap的存在,其实又是一种空间换时间的策略。因为相比内存的价格,降低GC延时明显更重要。

但是JVM的执行流那么多,何时?在什么地方?更新OopMap呢?这就是安全点存在的意义。安全点同时解决了STW及更新OopMap。

其实也可以这样说,不理解安全点就无法理解STW,甚至于无法理解GC。

安全点

安全点涉及的知识点非常多、非常底层。下面就讲安全点中与STW相关的知识点。其他的知识点后面会写系列文章展开讲。感兴趣的小伙伴可以关注我公众号关注我的发文动态:硬核子牙。

这段代码是大家看GC源码时经常看到的

SafepointSynchronize::begin

我把hotspot源码中核心的代码粘过来

JVM中怎么做到STW使程序暂停

这段代码到底做了哪些事情呢:

STW的真面目

安全点是如何解决让所有的线程都阻塞的呢?开启安全点为什么要将物理页的属性改为不可读呢?

因为JVM在生成执行流代码的时候,都会在适合作为安全点的地方插入一段代码

JVM中怎么做到STW使程序暂停

这段代码就是安全点的本质,也是触发STW的本质。什么意思呢?如果os::_polling_page对应的物理页属性是可读的,这段代码并没什么特殊意义。但是如果是不可读的,读的时候就会触发段异常,对应的操作系统信号:SIGSEGV。

JVM捕获了这个异常,并进行了处理。所有的线程都是在这个地方STW的。

JVM中怎么做到STW使程序暂停

这就是安全点难的地方,涉及到的知识点太多太底层!其实我搞手写JVM小班的核心目的不是带你写一个JVM,其一是让你通过手写JVM了解hotspot的体系,你才能看得懂hotspot源码。其二,也是最核心的,掌握底层。因为掌握了底层,你对技术就没有恐惧之心了,你会觉得你无所不能。事实上,相对的无所不能是可以做到的,只是需要时间沉淀。啰嗦了两句哈。

GC结束后唤醒所有阻塞的线程,小伙伴们应该能想到是在哪里?如何唤醒的了吧

JVM中怎么做到STW使程序暂停

关于JVM中怎么做到STW使程序暂停就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下编程网网站!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯