來聊聊JVM中安全點的概念

文章目錄

    • 寫在文章開頭
    • 詳解safepoint基本概念
      • 什么是安全點?為什么需要安全點
      • JVM如何讓線程跑到最近的安全點
      • 線程什么時候需要進入安全點
      • JVM如何保證線程高效進入安全點
      • 如何設置安全點
      • 用一次GC解釋基于安全點的STW
    • 實踐-基于主線程休眠了解安全點的工作過程
      • 代碼示例
      • 基于日志印證執行流程
      • 優化思路
    • 關于安全點更進一步的理解
      • 關于安全點的調優建議
      • JDK11對于安全點的優化
      • RocketMQ中對于安全點的優化
    • 小結
    • 參考

寫在文章開頭

近期在分享關于synchronized關鍵字的文章的時候提到了一個關于安全點的概念,有讀者反饋這塊知識點講的有些潦草,遂以此文簡單介紹一下JVM中關于安全點的概念。

在這里插入圖片描述

詳解safepoint基本概念

什么是安全點?為什么需要安全點

在正式講解安全點之前,我們不妨復習一下JVM中垃圾回收的基本過程,我們以CMS垃圾回收器為例,其垃圾回收過程在完成GC Roots查找與收集之后就會按照如下步驟執行:

  1. 初始標記
  2. 并發回收
  3. 最終標記(重新標記)
  4. 并發清除

要知道固定可作為GC Roots的節點主要是:

  1. 全局引用:例如常量或者靜態變量。
  2. 執行上下文即棧幀中的變量表。

對于現代java應用而言,光是方法區就可能有數百上千兆,所以對于這些起源的引用也并非一件容易的事情。這也就意味著JVM在進行垃圾回收時并不能通過逐個掃描檢查來實現。
就目前主流的JVM來說,針對根節點枚舉基本都是采用空間換時間的策略,也就是使用一組OopMap,全稱為"Object Pointer Map"(對象指針映射),本質上就是一個位圖索引,它會通過以下兩個時機完成對象信息的緩存:

  1. 類加載完成后,hotSpot就會基于類的偏移量信息計算出來并緩存。
  2. JIT階段也會在特定的時機(這一點后續會詳細說明)計算出棧或寄存器中的那些位置是引用,并將其緩存。

如此一來,下次進行根枚舉時就可以直接基于OopMap高效完成:

在這里插入圖片描述

但是java進程的運行的瞬息萬變的,可能此刻的對象在下一刻就不可用,下一刻又有新的對象誕生,這種引用關系的實時變化亦或者說導致OopMap內容變化的指令是非常多的,若針對每一個指令都設置對應的oopMap,那么內存的開銷是非常高昂的。

所以就有了安全點(safepoint)的概念,這也就是我們上文所提及的特定的位置,基于這個設定,用戶的程序僅僅會在特定的情況下生成oopMap,同理在垃圾回收時,也要求所有線程達到安全點后才能夠暫停并進入STW從而開始進行初始標記、最終標記等操作:

在這里插入圖片描述

例如下面這段代碼:

Object o=new Object();

對應匯編碼如下,可以看到0x00000000031ffb8fcall指令,它指明偏移量40-852處有一個普通對象指針Oop(Ordinary Object Pointer)

0x00000000031ffb80: mov    $0xf5,%edx0x00000000031ffb85: mov    %ecx,%ebp0x00000000031ffb87: mov    %rbx,0x28(%rsp)0x00000000031ffb8c: data16 xchg %ax,%ax0x00000000031ffb8f: callq  0x00000000030957a0  ; OopMap{[40]=Oop off=852};*new  ; - java.lang.String::<init>@58 (line 205); - java.lang.String::substring@52 (line 1933);   {runtime_call}

JVM如何讓線程跑到最近的安全點

對于安全點上的線程中斷策略,大體來說是有兩種:

  1. 搶占式:當需要進入安全點時,JVM會主動掛起所有的用戶線程,如果線程未在安全點則等到該線程進入安全點進入安全點并完成中斷。這種做法最大的缺點就是時間不可控即很可能存在性能不穩定亦或者吞吐量的波動,所以截至目前還有那款虛擬機采用搶占式的方式完成線程中斷。
  2. 主動式:這種方式是讓線程去維護一個標志位,需要進入安全點時修改該變量,用戶線程就會在合適的時機檢查這個變量值,如果這個值為真時就進入安全點。

線程什么時候需要進入安全點

除了常見的垃圾回收標記觸發STW使得所有線程需要進入安全點以外,對應的進入安全點的時機還有:

  1. 使用jstatjmapjstack等命令,為保證監控堆棧信息的實時正確性,所有線程需要STW并進入安全點暫停。
  2. JDK8默認情況下定時進入安全點,保證一些需要進入安全點的操作能夠及時運行。
  3. JIT編譯代碼優化例如:OSR(棧上替換即一種運行時替換棧幀的技術)或者去優化即Bailout(將JIT編譯后的代碼回退,解釋器模式),因為可能存在執行指令的變化,線程就需要進入安全點。
  4. java agent需要對類進行增強導致類重新定義,需要修改類的相關信息,所以需要進入安全點。
  5. 高并發情況下,鎖升級機制會涉及偏向鎖撤銷,需要進入STW所以也需要進入安全點。

JVM如何保證線程高效進入安全點

我們以線程運行JIT編譯好的代碼為例,它的設計與實現步驟為:

  1. JVM初始化一個異常處理器,專門捕獲對應的page fault缺頁中斷異常。
  2. JIT編譯代碼期間,會基于我們上述的規則在特定位置插入一條精簡的指令,作為安全點檢查。
  3. VM線程通知當前線程進入安全點,將線程內部維護的內存頁即polling page設置為不可讀。
  4. 線程執行這條機器碼指令發現內存頁不可讀,觸發缺點中斷。
  5. 異常處理器捕獲這個異常,線程進入安全點。

在這里插入圖片描述

對應的我們也給出這段精簡的匯編碼指令,即test %eax,0x160100 ; {poll} 這段指令,這段指令本質上就是執行poll操作檢查安全點,嘗試訪問線程內存頁對應地址為0x160100,如果發現不可訪問則觸發缺頁中斷進入安全點:

0x01b6d627: call   0x01b2b210         ;<

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80811.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搭建 Spark YARN 模式集群指南

在大數據處理領域&#xff0c;Apache Spark 憑借其卓越的性能和易用性廣受青睞。而 YARN&#xff08;Yet Another Resource Negotiator&#xff09;作為 Hadoop 的資源管理框架&#xff0c;能高效管理集群資源。將 Spark 與 YARN 結合&#xff0c;以 YARN 模式搭建集群&#xf…

WPF之Label控件詳解

文章目錄 1. 引言2. Label控件基礎2.1 類繼承結構2.2 Label類定義 3. Label控件的核心屬性3.1 Content屬性3.2 Target屬性3.3 其他常用屬性 4. 標簽樣式與模板自定義4.1 簡單樣式設置4.2 使用Style對象4.3 觸發器使用4.4 使用ControlTemplate完全自定義 5. Label與表單控件交互…

一種改進的YOLOv11網絡,用于無人機視角下的小目標檢測

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 摘要 隨著無人機&#xff08;UAV&#xff09;和計算機視覺技術的快速發展&#xff0c;從無人機視角進行目標檢測已成為一個重要的研究領域。然而&#xff0c;無人機圖像中目標像素占比極小、物體尺度變…

Adobe Lightroom Classic v14.3.0.8 一款專業的數字攝影后期處理軟件

軟件介紹 Adobe Lightroom Classic 2025中文激活版&#xff08;Adobe桌面照片編輯軟件&#xff09;LRC2025&#xff08;LR2025本地離線版&#xff09;是一款桌面照片編輯器和相冊管理軟件的raw格式編輯軟件&#xff0c;支持各種RAW圖像相機配置&#xff0c;HDR全景照片&#x…

【Statsmodels和SciPy介紹與常用方法】

Statsmodels庫介紹與常用方法 Statsmodels 是一個強大的 Python 庫&#xff0c;專注于統計建模和數據分析&#xff0c;廣泛應用于經濟學、金融、生物統計等領域。它提供了豐富的統計模型、假設檢驗和數據探索工具&#xff0c;適合進行回歸分析、時間序列分析等任務。本文將介紹…

【Rust通用集合類型】Rust向量Vector、String、HashMap原理解析與應用實戰

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

SoapUi測試1——REST(WebAPi、Json協議/HTTP、Post通訊方式)接口測試

文章目錄 1背景1.1接口測試工具SoapUi產生背景1.2常見接口類型1.3接口包含內容1.4請求格式 2軟件使用3http、webservice、webapi如何測試3.1REST&#xff08;WebAPi、JSON/HTTP、POST&#xff09;3.2SOAP&#xff08;Webserver、XML/HTTP、POST&#xff09; 1背景 1.1接口測試…

Linux按鍵驅動測試

文章目錄 一、設備節點添加 二、創建驅動文件代碼 2.1 核心數據結構 2.2 按鍵值定義 2.3 關鍵函數實現 三、創建測試文件 四、測試 一、設備節點添加 首先在設備樹文件中添加pinctrl以及在根目錄下添加設備節點。如下&#xff1a; //創建按鍵輸入的pinctrlpinctrl_key: keygrp…

5000元可以運行32B大模型的筆記本

5000元可以運行32B 大模型的筆記本 榮耀筆記本 X14 Plus 銳龍版 R7-8845HS -32G -1T 模型名稱 模型大小 tokens/s qwq-32b-q4 19GB 2.4 Qwen2.5-Coder-14B- Q8 16GB 4 DeepSeek-R1-Distill-Qwen-7B-Q8 8GB 8.1 DeepSeek-R1-Distill-Llama-8B-Q4 5GB 11.7

arm設備樹基礎知識

文章目錄 前言dts片段通用屬性介紹地址大小中斷phandlecompatible mmc節點介紹 前言 arm開發&#xff0c;早晚要了解設備樹 dts片段 interrupt-parent <0x8005>; model "linux,dummy-virt"; #size-cells <0x02>; #address-cells <0x02>; co…

【C++ 核心知識點面試攻略:從基礎到實戰(上位機開發視角)】

一、命名空間&#xff08;Namespace&#xff09;相關問題 問題1&#xff1a;C引入命名空間的核心目的是什么&#xff1f;如何通過命名空間解決命名沖突&#xff1f; 答案&#xff1a; C引入命名空間的核心目的是 避免全局作用域中的命名沖突&#xff0c;通過將變量、函數、類…

線性代數與數據學習

The Functions of Deep Learning (essay from SIAM News, December 2018) Deep Learning and Neural Nets

phpstorm用php連接數據庫報錯

項目場景&#xff1a; phpstorm用php連接數據庫 問題描述 用php使用mysql_connect 的時候報錯了&#xff0c;沒有這個函數 原因分析&#xff1a; php解釋器問題&#xff0c;后來查資料得知mysql_connct只適用于php5.5以下解釋器。一開始用的7&#xff0c;改成5.3以后還是報…

51c大模型~合集122

我自己的原文哦~ https://blog.51cto.com/whaosoft/13877107 #PHYBench 北大物院200人合作&#xff0c;金牌得主超50人&#xff01;PHYBench&#xff1a;大模型究竟能不能真的懂物理&#xff1f; 本項目由北京大學物理學院朱華星老師、曹慶宏副院長統籌指導。基準設計、…

單片機 + 圖像處理芯片 + TFT彩屏 觸摸滑動條控件

觸摸滑動條控件使用說明 一、項目概述 本項目基于單片機和RA8889/RA6809圖形處理芯片的TFT觸摸屏滑動條控件。該控件支持水平和垂直滑動條&#xff0c;可自定義外觀和行為&#xff0c;并支持回調函數進行值變化通知。 硬件平臺&#xff1a;51/ARM均可(測試時使用STC8H8K64U單…

linux離線安裝zsh

下載zsh 下載倉庫后解壓 下載地址&#xff1a;https://github.com/zsh-users/zsh 離線安裝 安裝方法見INSTALL文件 ./configure --prefix[/usr/local] make make install

機器學習中的數據轉換:關鍵步驟與最佳實踐

機器學習中的數據轉換&#xff1a;關鍵步驟與最佳實踐 摘要 &#xff1a;在機器學習領域&#xff0c;數據是模型的核心&#xff0c;而數據的轉換是構建高效、準確模型的關鍵步驟之一。本文深入探討了機器學習中數據轉換的重要性、常見的數據類型及其轉換方法&#xff0c;以及在…

TDR阻抗會爬坡? 別擔心,不是你的錯,你只是不夠了解TDR!

在背板系統或任何長走線設計里&#xff0c;你大概都碰過這畫面&#xff1a; TDR 曲線一開始乖乖在 92 Ω&#xff0c;但越往末端、阻抗越爬越高&#xff0c;來到最高 97 Ω&#xff0c;心里瞬間涼半截 &#x1f612; &#xff0c;「難不成... 板廠又翻車了嗎&#xff1f;」 然…

在另外一臺可以科學下載的電腦用ollama下載模型后,怎么導入到另外一臺服務器的ollama使用

環境&#xff1a; Win10專業版 Ubuntu20.04 問題描述&#xff1a; 在另外一臺可以科學下載的電腦用ollama下載模型后&#xff0c;怎么導入到另外一臺服務器的ollama使用&#xff0c;原電腦win10上的ollama下載的模型,復制到ubuntu20.04的ollama上推理 解決方案&#xff1a;…

Ethan獨立開發產品日報 | 2025-04-27

1. CreateWise AI 旨在提升你工作效率的AI播客編輯器 人工智能播客編輯器&#xff0c;讓你的播客制作速度提升10倍&#xff01;它可以自動去除口頭語和沉默&#xff0c;生成節目筆記和精彩片段&#xff0c;還能一鍵制作適合社交媒體分享的短視頻——所有這些功能都只需一次點…