title: jvm學習筆記——gc概述
date: 2018/9/2 12:05:00
description: 最近開始著手jvm的學習,在這裡把自己學習過程中的筆記分享出來,希望能幫到一些小夥伴,同時也是對自己的學習的一個梳理。
其實gc主要就是思考以下三件事情:
什麼時候**(判斷物件是否“死去”)
換句話來說,以上4中型別其實就是:類成員變數,類靜態變數,常量,區域性變數,只要某個物件不被以上4種型別關聯到,那麼該物件就是“已死”的,gc時就會被**記憶體空間。
如何**(垃圾收集演算法)
複製演算法(copying)
針對標記-清除的效率問題,複製演算法將記憶體分為兩塊空間,每次只使用其中一塊。當這塊的記憶體空間用完時,將存活的物件移到另一塊中,然後將已使用的記憶體空間一次性清理掉。這樣做的好處是不會產生碎片,清除也是針對連續的空間做處理,只要移動堆指標就行。
實際上在現在的虛擬機器中,將這種演算法應用在新生代。按照8:1:1的比例將記憶體分為三塊,每次使用一塊較大的與較小的其中一塊,清理時將存活物件移到剩下的一塊中,這樣每次只會浪費10%的記憶體,由於新生代中的記憶體一般都是“朝生夕死”的,使用這種演算法可以極大的提升效率。但是,不能保證每次清理時,剩下的一塊空間能夠存放所有的存活物件,所以這裡會依賴其他記憶體空間(一般指老年代)進行分配擔保(handle promotion)。
標記-整理演算法(mark-compact)
複製演算法在物件存活率較高時,效率就會變低,所以針對高物件存活率的情況,就有人提出了該演算法。標記的過程並沒有變化,但標記後並不是進行“清除”,而是將存活的物件向一端進行移動整理,然後清除掉其餘的空間。現代虛擬機器常將這種演算法在老年代中使用。
分代收集演算法(generational collection)
分代收集演算法是根據物件的存活時間,將記憶體劃分幾塊(一般分為新生代和老年代),這樣就可以根據不同的記憶體區域特點採用不同的演算法。針對新生代,使用複製演算法,用少量的記憶體空間換來更大的效率;針對老年代,使用標記-整理或標記-清除來處理。
JVM學習筆記4 GC引數
最古老,最穩定,效率高 缺點 可能產生較長的停頓 xx useserialgc 新生代,老年代使用序列 新生代標記 壓縮 因為新生代物件多 老年代複製 老年代物件少 注意 並行不一定快!1 parnew xx useparnewgc 新生代並行 老年代序列 新生代老年代都使用複製演算法,需要多核支援...
JVM學習筆記
1.jvm預定義的三種型別載入器 bootstrap extension system 特殊 上下文類載入器 2.遞迴的方式找父類載入器 意義 防止記憶體 現多份同樣的位元組碼 被native關鍵字修飾 本地方法 可以被c重寫 效能 底層硬體 引用計數法 和 可達性分析演算法 gc roots mi...
jvm學習筆記
自己之前也看過一些關於jvm的書籍,知道jvm的記憶體分幾個區域 一個物件從建立到銷燬在這個幾個區域是怎麼扭轉的,類載入機制是怎麼樣的 知道幾種 演算法 也大概清楚常見垃圾 器的基本執行過程,好像常見的oom fullgc排查工具和步驟也清楚,應付一般的面試的話基本也ok 但是,當在工作中實際遇見幾...