偏向鎖撤銷為什么會觸發STW?

偏向鎖撤銷觸發STW(Stop-The-World)的根本原因在于其撤銷操作需要??全局內存一致性??和??線程狀態確定性??,具體機制如下:


?? ??一、偏向鎖撤銷的核心流程??

  1. ??競爭觸發撤銷??
    當線程B嘗試獲取已被線程A偏向的鎖時,JVM檢測到競爭,觸發撤銷操作。
  2. ??掛起持有線程??
    需暫停持有偏向鎖的線程A,檢查其是否仍在同步塊中:
    • 若線程A已退出同步塊:直接撤銷偏向鎖,恢復為無鎖狀態(標志位01)。
    • 若線程A仍在同步塊中:升級為輕量級鎖(標志位00),線程B繼續競爭。
  3. ??對象頭修改??
    將對象頭(Mark Word)中的線程ID移除,替換為輕量級鎖指針或無鎖狀態。

🛑 ??二、STW的必要性??

撤銷操作必須在??全局安全點(Safepoint)?? 進行,原因如下:

  1. ??線程狀態一致性??
    需確保所有線程(尤其是持有偏向鎖的線程)處于可安全掛起的狀態(如未執行字節碼),防止撤銷過程中線程修改對象頭或棧幀。
  2. ??線程棧遍歷需求??
    判斷線程A是否在同步塊中,需遍歷其棧幀中的Lock Record(鎖記錄)。若線程未暫停,棧幀可能動態變化,導致數據不一致。
  3. ??內存屏障要求??
    對象頭修改需原子性,且其他線程必須立即可見。STW期間可避免CPU緩存與主存不一致問題。

?? ??三、STW的性能影響??

  • ??短暫停頓??:單次撤銷通常耗時??微秒級??(如0.1-1ms),對低競爭場景影響小。
  • ??高并發瓶頸??:頻繁競爭會導致多次撤銷,累積STW時間顯著增加(如百線程競爭時可達毫秒級)。
  • ??日志示例??:
    啟用安全點日志(-XX:+PrintSafepointStatistics)可見:
    RevokeBias [threads: 200 initially_running: 5] 
    [time: spin=0.1ms block=2ms cleanup=0.5ms vmop=15ms]
    其中vmop=15ms為實際STW時間。

?? ??四、不同場景下的撤銷處理??

??場景??處理方式是否需STW
持有線程已退出同步塊直接恢復為無鎖狀態是(但操作更快)
持有線程仍在同步塊中升級為輕量級鎖
調用hashCode()/wait()強制撤銷并升級重量級鎖

調用hashCode()會覆蓋Mark Word中的線程ID,強制撤銷偏向鎖。


🚀 ??五、優化建議??

  1. ??禁用偏向鎖??
    高并發場景(如秒殺系統)通過 -XX:-UseBiasedLocking 禁用,避免頻繁撤銷導致的STW。
  2. ??監控安全點??
    臨時開啟日志定位非GC導致的STW:
    -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
  3. ??升級JDK版本??
    JDK 15+ 默認關閉偏向鎖,JDK 18+ 已移除該機制,徹底規避此問題。

💎 ??總結??

偏向鎖撤銷觸發STW的本質是??保證內存與線程狀態一致性??的代價。在單線程場景中,偏向鎖通過避免CAS操作提升性能;但在多線程競爭下,其撤銷機制反而成為瓶頸。??高并發系統應禁用偏向鎖??,選擇輕量級鎖(CAS)或直接使用java.util.concurrent中的并發工具(如ReentrantLock),以消除STW對延遲的影響。

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

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

相關文章

Java觀察者模式詳解

觀察者模式(Observer Pattern)是一種行為型設計模式,它定義了對象之間的一對多依賴關系,當一個對象(主題)的狀態發生改變時,所有依賴于它的對象(觀察者)都會自動收到通知并更新。 核心概念 觀察者模式包含以下核心角色: ?Subje…

創世新布控球 國標

目錄 結論: UDP模式 對講 平臺頁面設置 設備tcp被動 舊的創世版本(平臺選的設備tcp被動;設備側無法設置) 新創世從2.8改到180上,先UDP,全報文 參考文檔 結論: 對講的tcp主被動&#xff0…

【Dify精講】第18章:企業級功能定制

在企業級AI應用的實際部署中,你很快就會發現開源版本的標準功能往往無法滿足復雜的業務需求。作為一個在多家企業實施AI系統的老兵,我深知企業級定制的痛點和需求。今天,讓我們一起深入Dify的企業級功能定制,看看如何在現有架構基…

PHP $_GET 變量詳解

PHP $_GET 變量詳解 引言 在PHP編程中,$_GET變量是處理HTTP GET請求參數的一種非常便捷的方式。本文將詳細介紹PHP $_GET變量的使用方法、特點以及在實際開發中的應用。 一、什么是$_GET變量? $_GET是一個預定義的PHP超級全局變量,用于存儲HTTP GET請求中的數據。當用戶…

Kafka動態配置深度解析

在分布式消息隊列領域,Kafka憑借其高吞吐量、低延遲和可擴展性成為眾多企業的首選。隨著業務場景的日益復雜和數據流量的動態變化,靜態配置已難以滿足需求,Kafka的動態配置功能應運而生。通過動態配置,用戶無需重啟集群或中斷服務…

為WIN10微軟輸入法的全角切換Bug禁用Shift+Space組合鍵

20250621 By wdhuag 目錄 前言: 參考: 使用AutoHotkey屏蔽快捷鍵(推薦): 使用PowerToys的鍵盤管理器屏蔽快捷鍵(不推薦): 網上其它的方法: 前言: 是的…

Shell腳本調試與錯誤處理詳解

在 Shell 腳本中,set 命令用于控制腳本的執行行為和調試選項。以下是詳細解釋: 1. set -e 和 set e set -e(嚴格錯誤檢查): 當命令返回非零退出狀態(失敗)時,立即退出腳本。 示例&a…

鯤鵬服務器創建Zookeeper鏡像實例

配置Kafka過程中,少不了要使用Zookeeer,這里記錄一下配置Zookeeper鏡像實例的過程。 創建目錄 mkdir -p /data/docker/zookeeper/data mkdir -p /data/docker/zookeeper/conf mkdir -p /data/docker/zookeeper/logs說明:data目錄為數據掛載…

GitHub Actions 自動 CI 測試 WorkFlow工作流搭建

大家好,我是此林。 代碼托管平臺 Github 我們應該比較熟悉。每次我們提交代碼到 GitHub 倉庫時,特別是開源項目,一般都會自動觸發測試腳本運行,幫你驗證代碼沒有引入新的錯誤。 這個其實就是 GitHub Actions,一般我們…

0-機器學習簡介

有監督學習 目標:建立一個模型(函數),來描述輸入(x)和輸出(y)之間的映射關系。 價值:模型訓練完成后,新的輸入,模型會給出預測值輸出。 注意點: 1.要有足夠的訓練樣本 2.輸入和輸出之間有關聯關系 3.輸入…

前端跨域解決方案(6):Nginx

1 Nginx 核心 Nginx 是一個開源的高性能 HTTP 和反向代理服務器,以輕量級、高并發處理能力和低資源消耗著稱。除作為 Web 服務器外,還可充當郵件代理服務器和通用的 TCP/UDP 代理服務器,廣泛應用于現代 Web 架構中。 在 Windows 系統中使用…

C++智能指針編程實例

智能指針是C11引入的重要特性&#xff0c;用于自動管理動態分配的內存&#xff0c;防止內存泄漏。下面介紹幾種高級智能指針編程實例。 1. 共享所有權模式 (shared_ptr) 循環引用問題及解決方案 #include <memory> #include <iostream>class B; // 前向聲明clas…

單元測試總結

一、測試方案: 單元測試方案應包括以下步驟: 1.理解代碼結構:仔細閱讀代碼,理解程序的結構、邏輯和算法。 2.制定測試目標:明確你想要測試的功能和輸出結果; 3.撰寫測試用例:編寫涵蓋所有測試目標的測試用例; 4.執行測試:運行測試用例以驗證功能的正確性; 5.編寫報告:根據測試…

Spring面向切面編程AOP(2)

前置通知&#xff08;Before Advice&#xff09; 前置通知在目標方法執行之前被調用&#xff0c;常用于執行一些預處理邏輯&#xff0c;例如權限驗證、參數校驗等。在 Spring 配置文件中&#xff0c;前置通知通過<aop:before>標簽進行配置&#xff0c;以下是一個典型的示…

設備故障預測與健康管理技術:從數據到決策的工業智能進化之路?

在工業 4.0 與智能制造浪潮的推動下&#xff0c;設備故障預測與健康管理&#xff08;Prognostics and Health Management, PHM&#xff09;技術已成為企業實現數字化轉型的核心驅動力。據統計&#xff0c;制造業中設備非計劃停機 1 小時的平均損失高達 25 萬美元&#xff0c;而…

RabbitMQ從入門到實踐:消息隊列核心原理與典型應用場景

在現代應用開發中&#xff0c;系統各部分之間的通信至關重要。這就是像RabbitMQ這樣的消息代理發揮作用的地方。無論您是在構建微服務架構、實現任務隊列&#xff0c;還是開發實時聊天應用程序&#xff0c;RabbitMQ都可能成為改變游戲規則的工具。本文將深入探討RabbitMQ是什么…

基于Spring Boot和Vue的網上軍事論壇設計與實現

目錄 一.&#x1f981;前言二.&#x1f981;開源代碼與組件使用情況說明三.&#x1f981;核心功能1. ?算法設計2. ?Java開發語言3. ?Redis數據庫4. ?部署項目 四.&#x1f981;演示效果1. 管理員模塊1.1 用戶管理1.2 內容審核1.3 權限分配1.4 菜單管理1.5 字典管理 2. 用戶…

LLMs基礎學習(八)強化學習專題(6)

LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;6&#xff09; 文章目錄 LLMs基礎學習&#xff08;八&#xff09;強化學習專題&#xff08;6&#xff09;深度強化學習&#xff08;DQN&#xff09;DQN 起源&#xff1a;《Playing Atari with Deep Reinforceme…

JVM(10)——詳解Parallel垃圾回收器

Parallel 垃圾回收器&#xff08;也稱為 吞吐量優先收集器&#xff09;。它是 Java 早期&#xff08;特別是 JDK 8 及之前&#xff09;在多核處理器上的默認垃圾回收器&#xff0c;其核心設計目標是最大化應用程序的吞吐量。 一、Parallel 回收器的定位與設計目標 核心目標&am…

MySQL(91)什么是分布式數據庫?

分布式數據庫是一種將數據存儲在多個物理位置的數據庫系統。這些位置可能分布在不同的服務器、數據中心甚至地理位置。分布式數據庫系統允許數據的存儲、處理和訪問分布在多個節點上&#xff0c;以提高數據的可用性、可靠性、可擴展性和性能。 1. 分布式數據庫的特點 1.1 數據…