深入理解JAVA虛擬機學習筆記7——HotSpot的算法實現

2020-12-16 道IT

這一篇應該是在垃圾收集器那一篇之前的,當時由於有些地方不太理解,一直擱置了,幾天寫出來,仍然有很多自己揣測的地方,看的朋友可以有選擇的採納。

前面垃圾收集器概述的筆記中已經寫過,通過可達性分析算法——是否有到

達GC Roots的引用鏈來判斷,對象是否可以被回收。

對象之間的引用在類的成員變量初始化以及類的方法中都會出現,如果逐個遍歷,會消耗很多時間。

虛擬機是怎麼做的呢?使用一組OopMap來記錄對象在棧中的引用地址,這樣,HotSpot就可以快速找到GC Roots的對象集合。

(Oop:Ordinary Object Pointer,普通對象指針)

另外,如果在進行判斷分析的時候,有新的引用產生怎麼辦呢?

這就要求在虛擬機執行垃圾收集的時候,需要將所有虛擬機暫停(「Stop the world」),以保持快照的一致性。

但是如果積攢了比較多的對象集中進行分析,那麼這個暫停的時間就會比較長,一次收集的時間就會比較多。

如果通過增加垃圾收集頻次,減少每次垃圾收集分析工作量,那麼垃圾收集佔用總的時間也不少。

安全點:由於為每一條指令都生成OopMap需要大量的空間,所以只再特定的位置記錄這些信息,這些位置成為安全點。

安全點的選定是以「是否具有讓程序長時間執行的特徵為標準」進行選定。

長時間執行的的最明顯特徵是指令序列復用。

另外,虛擬機有兩種中斷方式。

1. 搶先式中斷:由虛擬機發起,所有線程全部中斷,不在安全點上的線程,恢復運行至安全點上。

2. 主動式中斷:由線程去輪詢是否中斷的標誌位,發現標識,就自己將線程暫停掛起。

HotSpot採用的是主動式中斷的方式。

安全區域(Safe Region):在一段代碼片段當中,引用關係不會發生變化。

作用:專門用來處理當進行垃圾收集的時候,沒有分配CPU時間的程序,比如線程處於Sleep狀態,這些線程沒辦法響應JVM的暫停要求,對於這種狀況,單獨設置了一個安全區域。

基本思路:1. 當線程執行到安全區域中的代碼時,標識自己進入了安全區域。

2. 當線程準備離開安全區域的時候,檢查垃圾收集是否完成,如果結束了,線程繼續執行;如果沒結束,就等到結束之後再離開安全區域。

喜歡文章或想一起學習的朋友可以關注我,給我點讚,我將會持續更新,有什麼疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。

相關焦點

  • 深入理解JAVA虛擬機學習筆記19——字節碼指令4(其他指令)
    指令這塊的相關信息我們在前幾篇的文章中已經有了基本了解,這一篇不過多解釋了,將剩下的指令列出來,作為記錄(節選自《深入理解JAVA虛擬機》)。虛擬機提供的int類型的條件分支指令是最為豐富和強大的。同步指令Java虛擬機可以支持方法級的同步和方法內部一段指令序列的同步。這兩種同步結構都是使用管理(Monitor)來支持的。方法級的同步是隱含的,既無需通過字節碼指令來控制,也實現在方法調用和返回操作之中。
  • 深入理解Java虛擬機:類加載機制
    調用一個類型的靜態方法的時候使用java.lang.reflect包的方法對類型進行反射調用的時候。當初始化類的時候,發現其父類還沒有進行過初始化的時候。當虛擬機啟動時,用戶需要制定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。
  • OpenJdk1.8筆記——java啟動流程
    Jdk中java的入口函數文件為openjdk\jdk\src\share\bin\main.c中的main方法(window上為WinMain),然後調用jdk8u-dev/jdk/src/share/bin/java.c的JLI_Launch方法,啟動一個jvm虛擬機;程序入口
  • 學習筆記 | Java虛擬機第一篇
    )來完成的,這個類是有虛擬機的具體實現指定的。實現步驟:開發人員可以通過繼承抽象類java.lang.ClassLoader類的方式,實現自己的類的加載器,以滿足特殊的需求。例如:類java.lang.Thread的setPriority()方法是用Java實現的,但是它實現調用的是該類裡的本地方法setPriority0()。這個本地方法是用C實現的,並被植入JVN內部,在Windows 95的平臺上,這個本地方法最終將調用win32 setpriority()的API。
  • 深入分析Java虛擬機堆和棧及OutOfMemory異常產生原因
    下面這張圖我想對於每個學習Java的人來說再熟悉不過了,這就是整個JDK的關係圖:從上圖我們可以看到,JavaVirtualMachine位於最底層,所有的Java應用都是基於JVM來運行的,所以學習JVM對任何一個想要深入了解Java的人是必不可少的。
  • Oracle獨家:Java虛擬機學習指南
    工欲善其事,必先利其器「為什麼學 Java 虛擬機」這個問題,就和「為什麼要學習數據結構和算法」是一個道理:工欲善其事,必先利其器。我總結了三點必須要學好 Java 虛擬機的理由:Java 已然是一門主流的工程語言,擁有大量的應用。
  • 學習Java 從這些書開始吧
    的學習指導,以生動有趣而風靡。本書是根據學習理論所設計的,可以從學習程序語言的基礎開始一直到包括線程、網絡與分布式程序等項目。而且不只是讀死書,你還會玩遊戲、拼圖、解謎題以及以意想不到的方式與java交互。在這些活動中,你會寫出一堆真正的java程序,包括了一個船艦炮戰遊戲和一個網絡聊天程序。
  • Java實現冒泡排序算法
    #理由一:面試的時候,千萬不要被數據結構與算法拖了後腿#理由二: 你真的願意做一輩子CRUD Boy嗎#理由三: 不想寫出開源框架,中間件的工程師,不是好廚子1.2.如何系統化學習數據結構與算法?我想好了,還是需要學習數據結構與算法。但是我有兩個困惑:1.如何著手學習呢?2.有哪些內容要學習呢?
  • 深入理解 Java 線程池!
    Runnable的接口,但是我們創建這兩種線程在運行結束後都會被虛擬機銷毀,如果數量多的話,頻繁的創建和銷毀線程會大大浪費時間和效率,更重要的是浪費內存,線程執行完畢後變為死亡狀態,線程對象變為垃圾,這個需要依靠虛擬機進行監督和回收,影響系統的性能。
  • 精通Java虛擬機必讀書籍推薦書單
    深入理解JVM & G1 GC推薦語:主要為學習Java語言的學生、初級程式設計師提供GC的使用參考建議及經驗,著重介紹了G1GC。通讀《深入理解JVM&G1GC》後,讀者可以深入了解G1GC性能調優的許多主題及相關的綜合性知識。讀者也可以把《深入理解JVM&G1GC》作為參考,對於感興趣的主題,直接跳到相應章節尋找答案。書單3:自己動手寫Java虛擬機
  • 九年程式設計師推薦java書籍
    首先知乎爬取了以 #java# 為關鍵詞的三千本書,然後去除評分在7.5以下和評論人數少於150人次的書籍,最終得到以下篩選出以下結果.我將以評論人數排行榜&評分排行榜&綜合排行榜,進行書單的展示!並且你可以通過點擊書名,直接進入豆瓣查看該書的相關信息.
  • Java學習必備書籍推薦終極版!
    JVM•《深入理解 Java 虛擬機(第 2 版)周志明》[9](推薦,豆瓣評分 8.9,1.0K+人評價):建議多刷幾遍,書中的所有知識點可以通過 JAVA 運行時區域和 JAVA 的內存模型與線程兩個大模塊羅列完全。
  • 一篇文章全面吃透Java虛擬機,線程安全的實現方法
    由於java虛擬機的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,所以,為了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,所以我們說,它是線程私有的.
  • JAVA應用可視化診斷工具
    )JCMD、JHSDB整合了上一篇的命令HSDB圖形界面啟動方式java9: jhsdb hsdb --pid LVMIDjava8:在JDK/lib目錄下命令行執行:java -cp ./sa-jdi.jar sun.jvm.hotspot.HSDB 或java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB點擊File-》Attach to Hotspot Process,輸入進程IDJava Threads窗口:1:Inspect Thread:查看選中的線程對應的
  • 讀 Java Arrays 源碼 筆記
    它提供的操作包括:排序 sort查找 binarySearch()比較 equals填充 fill轉列表 asList()哈希 Hash()轉字符串 toString()這個類的代碼量很多,Java1.7中有4000多行。
  • Java虛擬機系列一:一文搞懂 JVM 架構和運行時數據區
    不過估計很多小夥伴和我一樣,長時間醉心於 CRUD,卻忘了去了解一下更底層、更基礎的東西,殊不知這些才是決定你能在這條路上走多遠的關鍵因素,那接下來我們就一起來深入學習一下看似神秘的 JVM 吧。JVM 總體來看內容還是很多的,我會把最重要的內容介紹給大家,不過如果你有時間和精力的話,還是推薦你去看一下《深入理解Java虛擬機》這本書,確實是有口皆碑。
  • Java高級開發工程師書單
    第一,linux作業系統讓數據結構、算法、計算機系統結構、彙編、驅動、有了馳騁的疆場。作業系統的設計理念得到實現或試驗,而不是僅僅停留在白紙上。第二,問題的思考層次,編程中出現的問題能嘗試從多層次出發進行考慮,如CPU指令/作業系統實現(包括模塊和驅動)/系統函數接口/C函數接口/應用系統,理解作業系統在其中能起到的橋梁作用,同時兼顧編譯器的幫助。第三,會令閱讀者對於資料庫、java虛擬機,TCP等有新的認識,形成知識體系和脈絡。
  • 「原創」JVM系列02|Java虛擬機結構
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫Java虛擬機學習 Java 虛擬機,先要掌握其基本結構,了解各部分有什麼作用,各部分之間是如何協調工作的。
  • Java 學習路線
    很多人由 java 後臺入門,在轉型大數據、架構師方向,這個的根據自己的情況定就好了,對於自己感興趣的公司,可以到招聘官網上,看看詳細要求的技術棧有哪些,按照著準備、學習就好了。Java 學習路線黑馬 java 後臺路線 國內 Java 視頻,黑馬算是比較經典的了,按照路線圖學習就好。