帶你清晰認識,Java虛擬機器記憶體管理!
Java虛擬機器規範將實體記憶體(主記憶體和CPU中的快取、暫存器)劃分為程式計數器、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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小試Java虛擬機器記憶體管理(Java 8)Java虛擬機記憶體
- JAVA 虛擬機器可用記憶體Java虛擬機記憶體
- Java虛擬機器:記憶體管理與執行引擎Java虛擬機記憶體
- Java虛擬機器12:Java記憶體模型Java虛擬機記憶體模型
- Java 虛擬機器之三:Java虛擬機器的記憶體結構Java虛擬機記憶體
- 淺析虛擬機器記憶體管理模型虛擬機記憶體模型
- Java虛擬機器之記憶體區域Java虛擬機記憶體
- Java虛擬機器4:記憶體溢位Java虛擬機記憶體溢位
- 深入理解Java虛擬機器(自動記憶體管理機制)Java虛擬機記憶體
- 深入理解Java虛擬機器筆記-自動記憶體管理機制Java虛擬機筆記記憶體
- Java虛擬機器記憶體模型學習筆記Java虛擬機記憶體模型筆記
- 《深入理解Java虛擬機器》個人讀書總結——JAVA虛擬機器記憶體Java虛擬機記憶體
- Java虛擬機器記憶體分配與回收策略Java虛擬機記憶體
- Java虛擬機器記憶體區域詳解Java虛擬機記憶體
- Java虛擬機器記憶體區域劃分Java虛擬機記憶體
- eclipse 設定java虛擬機器記憶體EclipseJava虛擬機記憶體
- Java虛擬機器:JVM記憶體分代策略Java虛擬機JVM記憶體
- Java虛擬機器7:記憶體分配原則Java虛擬機記憶體
- Java虛擬機器記憶體優化實踐Java虛擬機記憶體優化
- 深入理解java虛擬機器 筆記一 ---自動記憶體管理機制Java虛擬機筆記記憶體
- Java零基礎學習之路(九)Java虛擬機器記憶體管理Java虛擬機記憶體
- Java虛擬機器2:Java記憶體區域及物件Java虛擬機記憶體物件
- [Java虛擬機器]Java記憶體模型與執行緒Java虛擬機記憶體模型執行緒
- AIX虛擬記憶體管理機制(轉)AI記憶體
- java虛擬機器記憶體的各個區域Java虛擬機記憶體
- java虛擬機器執行時記憶體分割槽Java虛擬機記憶體
- 【深入Java虛擬機器】之一:Java記憶體區域與記憶體溢位Java虛擬機記憶體溢位
- Java虛擬機器08——Java記憶體模型與執行緒Java虛擬機記憶體模型執行緒
- Java虛擬機器系列之Java記憶體結構簡介Java虛擬機記憶體
- 【Java 虛擬機器筆記】記憶體分配策略相關整理Java虛擬機筆記記憶體
- Java虛擬機器的記憶體空間有幾種Java虛擬機記憶體
- Java虛擬機器的記憶體空間有幾種!Java虛擬機記憶體
- 面試準備之java虛擬機器記憶體結構面試Java虛擬機記憶體
- 深入理解虛擬機器之Java記憶體區域虛擬機Java記憶體
- Java虛擬機器的記憶體是如何分佈的Java虛擬機記憶體
- 《深入java虛擬機器》讀書筆記之Java記憶體區域Java虛擬機筆記記憶體
- 【江楓】AIX虛擬記憶體管理機制AI記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體