jvm三色標記

好的,咱們把專業概念和生活例子結合起來,一步一步說清楚三色標記法:

一、核心概念:用“顏色”給對象貼“狀態標簽”

就像給家里的物品貼標簽,每種顏色代表它在“垃圾回收(大掃除)”中的狀態:

  1. 白色(White)
    • 專業定義:初始狀態,所有對象默認是白色,代表“未被回收器訪問,且暫時不確定是否有用”。回收結束后仍為白色的,就是垃圾,會被清理。
    • 生活例子:你剛進房間,地上的舊雜志、空飲料瓶都先貼“白色”——你還沒檢查它們,不知道該不該留。
  1. 灰色(Gray)
    • 專業定義:已被回收器訪問,但它引用的其他對象還沒處理完(相當于“待辦清單”)。
    • 生活例子:你手里的書包肯定有用(不能扔),但書包里的東西還沒掏出來看,所以給書包貼“灰色”——提醒自己:這東西得接著查里面的東西。
  1. 黑色(Black)
    • 專業定義:已被回收器訪問,且它所有引用的對象都處理完了,代表“確定有用,無需再管”。
    • 生活例子:你把書包里的課本、筆盒都檢查完了,這時給書包貼“黑色”——表示“書包有用,而且里面的東西也都查過了,不用再碰它了”。

二、工作流程:就像“從確定有用的東西開始,一步步排查所有該留的物品”

1. 初始階段:先找到“絕對有用的東西”(根對象)
  • 專業定義:根對象是程序中明確活躍的引用(如棧里的變量、靜態變量),它們一定有用,是標記的起點。初始時所有對象都是白色,只有根對象被標為灰色。
  • 生活例子:你進房間后,先找出“肯定不能扔”的東西——比如你正拿著的手機、身上穿的外套(這些是“根對象”),給它們貼“灰色”(因為要查它們關聯的東西,比如手機殼、外套口袋里的鑰匙)。
2. 標記階段:從灰色開始,一步步“查關聯、更新標簽”
  • 專業定義:從灰色對象出發,遍歷它引用的所有對象:
    • 把一個灰色對象標為黑色(確認它本身有用);
    • 掃描它引用的對象:如果是白色,就標為灰色(加入待查隊列);如果已經是灰/黑色,就跳過(避免重復查)。
    • 重復到灰色對象為空(所有有用的都被標記)。
  • 生活例子
    • 拿灰色的手機,貼成黑色(確認手機有用),然后看它的手機殼(白色→貼灰色);
    • 拿灰色的手機殼,貼成黑色,發現它掛著一個掛飾(白色→貼灰色);
    • 拿灰色的掛飾,貼成黑色,發現它沒別的關聯了;
    • 直到手里沒有灰色標簽的東西了(所有和“根對象”有關的有用物品都查完了)。
3. 回收階段:清掉剩下的“白色垃圾”
  • 專業定義:標記結束后,白色對象都是“無法通過根對象訪問的垃圾”,通過“清除”或“整理”釋放內存。
  • 生活例子:最后剩下的白色標簽物品(舊雜志、空飲料瓶),都是“和有用的東西沒關系”的垃圾,直接扔進垃圾桶。

咱們結合“打掃房間”的生活場景,同時對應專業邏輯,來講清楚漏標問題的原因和解決方案:

一、漏標問題:為什么會誤刪有用的東西?

專業本質:并發回收時,用戶線程修改對象引用,導致本應被保留的活躍對象未被標記,最終被誤判為垃圾。


生活例子:清潔工(回收器)和你(用戶線程)同時在房間里活動,你突然挪動了一個有用的東西,清潔工沒察覺,最后把它當垃圾扔了。

漏標的兩個必要條件(缺一個都不會發生):
  1. “已處理完的對象”失去了對某個對象的引用
    • 專業:黑色對象(已掃描完的活躍對象)原本引用著一個白色對象(未掃描),但用戶線程突然斷開了這個引用。
    • 生活:清潔工已經查完你的書包(貼黑色標簽,代表“處理完”),知道里面有個錢包。但你偷偷把錢包從書包里拿了出來,書包里沒錢包了。
  1. 這個對象被轉移到了“未處理的角落”
    • 專業:被挪走的白色對象,被另一個白色對象(未被掃描,不在待處理隊列)引用了。
    • 生活:你把錢包塞進了一個沒貼標簽的抽屜(白色標簽,代表“未處理”),而清潔工不知道這個抽屜里多了個錢包。

結果:清潔工覺得“錢包既不在已處理的書包里,也不在待處理的清單上”,最后把錢包當垃圾扔了——這就是漏標。

二、解決方案:如何避免漏標?

核心邏輯是阻止上述兩個條件同時成立,確保所有有用的東西都能被清潔工(回收器)發現。

1. 增量更新:“已處理的東西被動過?重新查!”
  • 專業原理:如果黑色對象(已處理)的引用被修改,就強制將其變回灰色,重新掃描它的所有引用,避免遺漏。
  • 生活例子:規則規定:“只要動過已查完的東西(黑色標簽),就必須重新查一遍。”你從書包(黑色)里拿出錢包后,書包自動變回灰色標簽。清潔工重新檢查書包時,發現你把錢包移到了抽屜,就會順著去查抽屜,找到錢包。
2. 原始快照:“按剛開始的樣子算,不管后來怎么動”
  • 專業原理:標記開始時記錄所有對象的引用關系快照,回收器只認快照中的引用,忽略后續修改。
  • 生活例子:清潔工打掃前先給房間拍了張全景照(快照),照片里錢包還在書包里。不管你后來把錢包移到哪,清潔工都按照片里的線索查——既然照片里書包有錢包,就會一直追查,直到找到錢包,不會當垃圾扔。

簡單說,漏標就是“回收器沒跟上用戶線程的修改”導致的誤判,解決方案要么是“修改時主動提醒”,要么是“讓已處理的對象重新檢查”,要么是“按初始狀態為準”,最終目的都是確保有用的東西不會被漏掉~

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

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

相關文章

生成式AI的能力邊界與職業重構:從“百科實習生“到人機協作增強器

根據微軟最新研究,基于20萬條Copilot使用數據及用戶反饋,研究者揭示了生成式AI在實際應用中的能力邊界與職業影響。數據顯示,用戶使用AI助手最頻繁的任務是信息獲取(占比近40%),其次是公眾溝通類工作&#…

java17學習筆記

Java17是一個重要的特性發布,也是比較常用的一個版本,根據 2024Java生態統計,Java 17、11 和 8 的用戶比例分別為 35%、33% 和 29%。它遵循了自Java10以來引入的Java發布步調,并于2021年 9 月 14 日發布,在Java16發布后…

【AI應用】修改向量數據庫Milvus默認密碼

說明: 1)部署向量數據庫milvus運行一段時間后,想開啟密碼認證登錄attu頁面 2)開啟密碼認證登錄,提示用戶和密碼不正確,因為默認密碼已存儲在物理機 3)通過attu管理頁面修改向量數據庫milvus默認…

分布式系統消息隊列:可靠投遞與延時消息實戰

在分布式系統架構中,消息隊列(MQ)作為解耦服務、削峰填谷、異步通信的核心組件,其消息投遞的可靠性與延時消息的精準性直接影響業務系統的穩定性。本文結合實際業務場景,詳細解析消息投遞的全流程設計與延時消息的通用…

Java 學習筆記(基礎篇6)

面向對象基礎1. 類和對象(1) 示例:public class Student {String name "張三";int age 23;public void study() {System.out.println("學習 Java");}public void eat() {System.out.println("吃飯");} }public class Test {public …

光學件加工廠倚光科技:陪跑光學未來力量

在光學創新的漫漫長路上,總有一些看似 “不劃算” 的堅持,卻在悄然改寫行業的未來。倚光科技的故事,就始于這樣一種選擇 —— 明知光學打樣利潤微薄,明知上百個項目中能走到量產的寥寥無幾,仍愿意投入全球頂尖的設備與…

RabbitMQ:生產者可靠性(生產者重連、生產者確認)

目錄一、生產者重連二、生產者確認一、生產者重連 當網絡不穩定的時候,利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試,也就是說多次重試過程中,當前線程是被阻塞的,會影響業務性能。 …

【深度學習新浪潮】空天地數據融合技術在城市三維重建中的應用

空天地數據融合技術在城市三維重建中的應用已取得顯著進展,尤其在提升精度以滿足具身智能機器人仿真訓練需求方面,研究和產品均呈現多樣化發展。以下是關鍵研究進展、產品方案及精度要求的詳細分析: 一、研究進展與技術路徑 1. 多源數據融合的技術突破 時空基準統一:通過…

Selenium自動化測試入門:cookie處理

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快driver.get_cookies() # 獲得cookie 信息driver.get_cookies(name) # 獲得對應name的cookie信息add_cookie(cookie_dict) # 向cookie 添加會話信息delete_cookie(na…

快解析如何讓遠程訪問更安全?

一、勒索病毒攻擊服務器的途徑很多用戶服務器對外開放,實現外網訪問,擔心服務器被勒索病毒攻擊!勒索病毒攻擊服務器的途徑之一是通過路由器開放的端口進行掃描攻擊,所以盡量不要在服務器的路由器和防火墻中開放端口二、快解析如何…

Linux下編譯ARPACK

本文記錄Linux下編譯ARPACK的流程。 零、環境 操作系統Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依賴 1.1 安裝oneAPI 參見:Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、編譯ARPACK …

芋道RBAC實現介紹

說明:之前寫過一篇博客,介紹如何搭建一個基于角色的權限驗證框架 搭建一個基于角色的權限驗證框架 本文介紹在非常受歡迎的開源框架——芋道中是如何實現 RBAC 的,芋道的部署參考下面這篇文章: 芋道微服務代碼部署 介紹 一般…

Docker部署Jellyfin,沒有公網IP如何使用內網穿透遠程訪問?

Jellyfin是一款完全開源、免費的媒體服務器,可幫助你快速搭建屬于自己的私人流媒體平臺:電影、劇集、音樂、照片統統收納,跨設備隨點隨播。本文將以最簡潔的步驟,演示如何在Docker容器中部署Jellyfin,并通過貝銳花生殼…

Podman:Mysql(使用卷)

下載鏡像hpphcomp:~$ podman pull docker.1ms.run/mysql:latest Trying to pull docker.1ms.run/mysql:latest... Getting image source signatures Copying blob c81e70a25040 done | Copying blob 31f7d8dc4024 done | Copying blob b9916866e45f done | Copying blob …

2025年滲透測試面試題總結-21(題目+回答)

安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 一、文件上傳繞過方式(Top 5) 二、文件包含高危函數(PHP為例&#xff0…

像海綿一樣吸收技術書籍的高效學習方法

像海綿一樣吸收技術書籍的高效學習方法前言六步高效閱讀法步驟1:快速瀏覽章節步驟2:先讀章末測驗步驟3:只讀粗體字步驟4:只讀每段的首句和末句步驟5:通讀整章步驟6:復習與重復高效學習技術書籍的實用技巧1.…

Day60--圖論--94. 城市間貨物運輸 I(卡碼網),95. 城市間貨物運輸 II(卡碼網),96. 城市間貨物運輸 III(卡碼網)

Day60–圖論–94. 城市間貨物運輸 I(卡碼網),95. 城市間貨物運輸 II(卡碼網),96. 城市間貨物運輸 III(卡碼網) 今天是Bellman_ford專場。帶你從普通的Bellman_ford,到隊列…

Jenkins服務器SSH公鑰配置步驟

步驟1. 在Jenkins服務器上生成SSH密鑰在Jenkins服務器上執行以下命令:# 1. 生成SSH密鑰對 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""# 2. 設置正確的權限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub# 3. 查看公鑰內…

數據鏈路層-網絡層-傳輸層

文章目錄深入淺出理解網絡核心:從交換機到TCP/UDP一、數據鏈路層:交換機的"地盤"1. 數據鏈路層的核心功能2. 以太網的發展歷程3. 以太網中的MAC地址4. 以太網幀格式:數據的"快遞包裝"5. 交換機的工作原理:高效…

專題:2025跨境電商市場布局、供應鏈與產業帶賦能報告 |附130+份報告PDF、原數據表匯總下載

原文鏈接:https://tecdat.cn/?p43616 2025年,跨境圈的老板們集體焦慮:美國關稅飆到145%,亞馬遜封號潮卷土重來,而東南亞卻悄悄漲了246%!這不是危言聳聽——66%的美國消費者說,海外貨漲10%就換本…