iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JVM中如何做到STW使程序暂停
  • 379
分享到

JVM中如何做到STW使程序暂停

2024-04-02 19:04:59 379人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

为什么需要STW呢?试想你妈给你打扫房间的场景:把你撵出去,关上门,打扫干净,打开门,数落你,揍你…一套标准化流程后,房间干净了。打完你,***心情变好了,打麻将都能多

为什么需要STW呢?试想你妈给你打扫房间的场景:把你撵出去,关上门,打扫干净,打开门,数落你,揍你…一套标准化流程后,房间干净了。打完你,***心情变好了,打麻将都能多赢点。

这里面有个关键环节:把你撵出去。尽管在打扫房间的过程中你可能不会制造垃圾,但是你的存在就有这个风险,所以必须把你撵出去。这话不是我说的,是从***行为中揣摩出来的。^_^

试想,如果不把你撵出去,你妈打扫垃圾的同时,你又陆陆续续制造了垃圾,那这场打扫房间的行动是不是变成了无法结束的行动啊。或者到某个时间点,你妈打扫了一半走了,丢下一句话:朽木不可雕也,孺子不可教也。

垃圾收集器也是一样的,为了保证清理垃圾的完整性,在某些环节,就会STW。比如所有垃圾收集器中都有的一个阶段:初始阶段,即扫描根对象,需要STW。小伙伴门看过的几乎所有资料,讲到这基本就没了对吧。但这不是子牙老师我的风格,咱们接着往后面说。

STW

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

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

  • 执行业务逻辑的用户线程

  • 执行native方法的Java线程

  • 执行垃圾收集的GC线程

  • 执行即时编译的JIT线程

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

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

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

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

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

如何暂停线程

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

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

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

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

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

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

安全点

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

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

SafepointSynchronize::begin

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

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

  • 告诉JVM马上要开始GC(下雨)了,开始做准备工作了(准备收衣服了)。本质就是修改一些属性位。比如第5行代码,通知解释器做好准备工作,迎接GC到来。

  • 将polling_page对应的物理页设置成不可读状态。这步非常非常重要。等下说。

  • 不停检测,确定是否所有的线程都已进入安全点。只有都已进入安全点,才能执行GC逻辑。

STW的真面目

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

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

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

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

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

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

以上就是JVM中如何做到STW使程序暂停的详细内容,更多关于STW如何暂停程序的资料请关注编程网其它相关文章!

--结束END--

本文标题: JVM中如何做到STW使程序暂停

本文链接: https://www.lsjlt.com/news/163553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM中如何做到STW使程序暂停
    为什么需要STW呢?试想你妈给你打扫房间的场景:把你撵出去,关上门,打扫干净,打开门,数落你,揍你…一套标准化流程后,房间干净了。打完你,***心情变好了,打麻将都能多...
    99+
    2024-04-02
  • JVM中怎么做到STW使程序暂停
    这篇文章跟大家分析一下“JVM中怎么做到STW使程序暂停”。内容详细易懂,对“JVM中怎么做到STW使程序暂停”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“JVM中怎么做到STW...
    99+
    2023-06-28
  • 小程序暂停服务如何设置
    这篇文章主要为大家展示了小程序暂停服务如何设置,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“小程序暂停服务如何设置”这篇文章吧。  小程序开发者可自行暂停小程序服务  什么是暂停服务  在小程序后...
    99+
    2023-06-26
  • Java中的线程如何使用使用join方法进行暂停
    Java中的线程如何使用使用join方法进行暂停?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下Java代码:package Threads;import java....
    99+
    2023-05-31
    java join 线程
  • 小程序开发中如何实现暂停正在播放的语音
    本文将为大家详细介绍“小程序开发中如何实现暂停正在播放的语音”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“小程序开发中如何实现暂停正在播放的语音”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容...
    99+
    2023-06-26
  • 在Web API程序中如何使用Swagger做接口文档
    这篇文章主要介绍了在Web API程序中如何使用Swagger做接口文档,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建Web API程序在VS2019中创建一个ASP.N...
    99+
    2023-06-03
  • 小程序中如何主动调用停止录音
    这篇“小程序中如何主动调用停止录音”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序中如何主动调用停止录音”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们...
    99+
    2023-06-26
  • Python重定向:如何在Spring大数据应用程序中做到这一点?
    在大数据应用程序中,重定向是非常重要的。它可以将程序的输出流重定向到文件或者其他流中,从而提高程序的效率和可维护性。在本文中,我们将介绍如何在Spring大数据应用程序中使用Python实现重定向。 环境准备 在开始之前,我们需要先准...
    99+
    2023-08-24
    重定向 spring 大数据
  • C#如何将DLL打包到程序中
    目录C#将DLL打包到程序中举例总结C#将DLL打包到程序中 有时候我们的程序中包含一些添加的DLL文件,使用起来不方便,我们可以把这些DLL文件打包到程序集中,只剩下一个EXE文...
    99+
    2023-01-28
    C#打包DLL C# DLL打包程序 将DLL打包到程序中
  • 微信小程序中如何使用wx.navigateTo返回到原页面
    这篇“微信小程序中如何使用wx.navigateTo返回到原页面”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“微信小程序中如何使用wx.navigateTo返回到原页面”,小编整理了以下知识点...
    99+
    2023-06-26
  • Java应用程序的日志记录:如何在Unix容器中做到最佳实践?
    日志记录是每个应用程序的必备功能。它可以帮助开发人员和运维人员快速定位和解决问题,同时也有助于监控应用程序的运行状态。在Unix容器中部署Java应用程序时,我们需要注意一些最佳实践,以确保日志记录功能的可靠性和稳定性。 使用日志框架 ...
    99+
    2023-06-21
    unix 容器 日志
  • 小程序开发中如何停止监听加速度数据
    这篇文章主要为大家展示了小程序开发中如何停止监听加速度数据,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“小程序开发中如何停止监听加速度数据”这篇文章吧。停止监听加速度数据。OBJECT参数说明:参...
    99+
    2023-06-26
  • 小程序中如何使用wx.createBLEConnection
    本文将为大家详细介绍“小程序中如何使用wx.createBLEConnection”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“小程序中如何使用wx.createBLEConnection”能够给你意想不到的...
    99+
    2023-06-26
  • 小程序中如何使用wx.writeBLECharacteristicValue
    这篇“小程序中如何使用wx.writeBLECharacteristicValue”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序中如何使用wx.writeBLECharacteristicValue”,给大家总结了以下...
    99+
    2023-06-26
  • 小程序中如何使用wx.getRecorderManager
    这篇文章主要为大家展示了小程序中如何使用wx.getRecorderManager,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“小程序中如何使用wx.getRecorderManager”这篇文章...
    99+
    2023-06-26
  • 详解如何将Spire.XLSforC++集成到C++程序中
    目录通过 NuGet 安装Spire.XLS for C++通过手动导入库安装 Spire.XLS for C++Spire.XLS for C++ 是一个 Excel 库...
    99+
    2023-03-11
    Spire.XLS for C++集成到C++ Spire.XLS for C++ Spire.XLS C++
  • Python中如何把程序放到后台执行
    直接上代码:[root@MGServer pythonscript]# cat getio.py#!/usr/bin/env python#encoding:utf8import sys,time,os,platform#定义我自己要在后台...
    99+
    2023-01-31
    后台 程序 Python
  • 小程序中如何停止搜寻附近的蓝牙外围设备
    本文将为大家详细介绍“小程序中如何停止搜寻附近的蓝牙外围设备”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“小程序中如何停止搜寻附近的蓝牙外围设备”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容...
    99+
    2023-06-26
  • Spring Path如何被打包到Java应用程序中?
    Spring Path是Spring框架中一个非常重要的模块,它提供了一种机制来管理应用程序中的资源文件。这些资源文件可以是配置文件、静态文件、模板文件等等。在Java应用程序中,Spring Path通常被打包成一个jar文件,这个文件...
    99+
    2023-06-14
    打包 spring path
  • 微信小程序中如何使用wx.previewImage
    这篇文章主要为大家展示了微信小程序中如何使用wx.previewImage,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“微信小程序中如何使用wx.previewImage”这篇文章吧。预览图片。O...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作