帶你清晰認識,Java虛擬機器記憶體管理!

陝西優就業發表於2019-01-03

Java虛擬機器規範將實體記憶體(主記憶體和CPU中的快取、暫存器)劃分為程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法區五個區域,但並沒有規定這些區域的具體實現,在其他地方聽到的一些名詞(如永久代、元空間等,這些都是方法區的具體實現)可能都是這些區域具體的實現,這點要特別注意,別被這些概念搞暈。

接下來,就和 陝西優就業 小編詳細瞭解一下吧!

帶你清晰認識,Java虛擬機器記憶體管理!

1、類載入器:

類載入器分為 Bootstrap 、 Extension ClassLoader (Java9 中是 Platform ClassLoader)、 Application ClassLoader,級別也是從低到高。

可以呼叫類載入器物件的 getParent() 方法查詢該級載入器的上一級載入器,也成為父類載入器。

可以根據需要繼承 Application ClassLoader 實現自定義類載入器,隔離載入器、修改類的載入方式、擴充套件載入源、防止原始碼洩露。

2、類載入的過程:

類載入是將位元組碼檔案例項化成 Class 物件並進行相關初始化的過程。類載入包括類的 載入 (Load)、類的 連結(Link)、類的 初始化 (init)三個步驟。

類的載入是將位元組碼檔案以二進位制流的方式讀取到記憶體中並轉化為特定的資料結構,檢查 cafe baby 這個魔法數(是不是Java檔案的標誌),是否有父類等,建立類對應的 Class 物件。

類的連結又分為 驗證 、 準備 、 解析 三個階段,驗證階段是進行更加詳細的校驗,如型別是否正確,靜態變數是否合理等;準備階段是為類的靜態變數分配記憶體空間,並設定預設值;解析階段是保證類和類之間相互引用的正確性,完成類在記憶體中的結構佈局。

3、訪問物件的兩種方式:

Java虛擬機器棧中的區域性變數表存放的資料除了基本的資料型別外,還有物件的引用型別(reference),這關係到如何訪問一個物件。

在不同的虛擬機器中,物件的訪問方式也是不同的,主流的訪問方式有 使用控制程式碼 和 直接指標 兩種。

4、判斷物件是否可以回收的演算法:

垃圾回收之前需要判斷物件是否可以回收,常見的判斷演算法有引用計數演算法和可達性分析演算法。

引用計數演算法:

每個物件都有對應的引用計數器,當有一個地方引用該物件時,就將引用計數器的值加1,當引用失效時,就將引用計數器的值減1,當計數器的值為0時,表示物件沒有引用,可以被回收了。

缺點:看起來簡單高效,但是有迴圈引用問題。如果兩個物件中包含對方的引用就會產生迴圈引用問題,導致垃圾收集器不能回收物件。

可達性分析演算法:

如果物件與GC Roots 之間沒有直接或間接的應用關係,就可以被回收了。常見的 GC Roots 物件包括虛擬機器棧(棧幀本地變數表)中引用的物件、方法區中靜態屬性引用的物件、方法區常量引用的物件、本地方法棧中(Native 方法)引用的物件。GC Roots,是一個特殊的物件,且絕對不能被其他物件引用,不然也會像引用計數演算法那樣有迴圈引用的問題。

5、常見的垃圾回收演算法:

標記-清除演算法

最基本的垃圾回收演算法,後續的演算法都是對它的改進。

首先標記出需要回收的物件,再將標記出的區域內容清除。

缺點是:標記時的查詢效率,清除時產生記憶體碎片。

6、常見的垃圾回收器:

Serial 回收器

Serial Old (PS MarkSweep)回收器

ParNew 回收器

Parallel Scavenge 回收器

Parallel Old 回收器

CMS 回收器

G1 回收器


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69902581/viewspace-2295415/,如需轉載,請註明出處,否則將追究法律責任。

相關文章