第三章 Hotspot演算法實現

2022-09-15 04:42:13 字數 1361 閱讀 3857

列舉根節點

可達性分析演算法中,需要根據gc roots節點下找出所有存活的引用(例如常量或者靜態屬性)與執行上下文(例如棧幀在巨集的本地變數表)。gc roots中的方法區可能會有數百兆,如果逐個檢索這裡的引用,那麼必然會消耗很多時間。

可達性分析演算法堆執行時間的敏感還體現在gc停頓上,因為這項分析公司必須在乙個能確保一致性的快照中進行---這裡的一致性是指整個分析期間整個執行系統看起來就像被凍結在某個時間點上,不可以出現分析過程中物件引用關係還在不斷變化的情況,該點不滿足的話,分析結果無法得到保證。這個gc 停頓被稱為stop the world。即使被稱為不會發生停頓的cms收集器中,列舉根節點時也必須要停頓。

當前主流j**a虛擬機器使用的都是標準式gc,所以當系統停頓下來時,不需要乙個不漏的檢測完所有執行上下文和全域性的引用變數,在hotspot虛擬機器中使用一組oopmap的資料結構來儲存哪些地方存放著物件引用。hotspot把物件內什麼偏移量上的什麼型別的資料計算出來,在jit編譯過程中,也會在特定的位置記錄下棧和暫存器中哪些位置是引用。這樣gc在掃瞄時就可以間接得知這些資訊了。

安全點在oopmap的幫助下,hotspot能很快完成gc roots的檢索,但是需要在乙個停頓中才可以保證gc roots檢索過程中引用關係不變。

hotspot沒有為每條指令都提供oopmap,而是在特定的位置記錄了這些資訊,這些位置被稱為安全點safepoint。safepoint安全點的選擇即不能太少以至於讓gc等待時間太長,也不能太多以至於過分增大執行時的負荷。所以安全點的選擇以程式「是否具有讓程式長時間執行的特徵」為標配進行選擇,「長時間執行」的最明顯特徵就是指令序列復用、例如方法呼叫、迴圈跳出、異常跳出等,所以以上這些功能的指令才會產生safepoint。

另乙個問題,safepoint如何在gc發生時讓所有執行緒(這裡不包括jni執行緒)都跑到最近的safepoint上再停頓下來,這裡提供了兩種方式:

在發生gc時,首先停頓所有執行緒,如果發現有執行緒不在安全點上,就恢復執行緒,讓其跑到安全點上

當gc需要中斷執行緒時,不直接對執行緒操作,而是設定乙個標誌,各個執行緒執行時主動輪訓這個標誌,發現中斷標誌為真時自己中斷掛起。輪詢標誌的位置與安全點時重合的,另外再加上建立物件需要分配記憶體的地方。

安全區域

使用safepoint似乎能夠完美的解決如果進入gc的問題,但實際上卻並不一定。

safepoint機制保證了程式執行時,在不太長的時間內就會遇到可以進入gc的safepoint,但是,在程式「不執行」(即程式沒有被分配cpu執行時間),典型的就是執行緒處於sleep狀態或者blocked狀態,這時候執行緒無法響應jvm的中斷請求,所以無法跑到safepoint點上進行掛起,這時候就需要被稱為安全區域的safe region來解決。

安全區域是指在一段**中引用關係不會發生變化。在這個區域的任何地方,開始gc都是安全的。

演算法第三章

單調遞增最長子序列分析 1.1 i 0時 dp 0 1 其餘情況 dp i max dp i dp j 1 0 j i 1.2填表的維度 一維 填表的範圍 dp 0 到 dp n 1 填表順序 從左向右 1.3因為要以每乙個數字終點,然後從頭遍歷到他本身,所以時間複雜度位o n 2 空間複雜度 建立...

《演算法》 第三章 查詢

在第三章裡面,並不是一開始就講的查詢,第一節中首先介紹的是符號表。符號表,其實就是儲存了鍵值對的一種資料結構,鍵值對用於將乙個鍵和乙個值聯絡起來。符號表支援兩種操作 插入 put 即將一組新的鍵值對存入表中 查詢 get 即根據給定的鍵得到對應的值。下面看一下書中關於符號表的應用以及api 書中對於...

第三章 演算法概述

3.5.1 模板語法 模板函式的模型和實現從乙個模板參數列開始。其語法包括關鍵字template,後面緊跟用角擴號括起來的形式型別的非空表在這個參數列中,每種型別前面都有關鍵字typename 不同的型別之間用逗號隔開。乙個模板型別的參數列 template 多個模板型別的參數列 template ...