JVM主要組成部分
Class loader(類加載器):根據給定的全限定名類名來裝載class檔案到方法區
Execution engine(執行引擎):執行classes中的指令,
Native Interface(本地介面):與native libraries互動,是其它編程語言互動的介面,
Runtime data area(運行時資料區域):這就是我們常說的JVM的記憶體,
運行時資料區
程式計數器:當前執行緒所執行的位元組碼的行號指示器 2個作用 1記錄執行緒執行位置; 2讀取指令
Java 虛擬機堆疊:用于存盤物件的參考,基本資料型別.
本地方法堆疊:與虛擬機堆疊的作用是一樣的,只不過虛擬機堆疊是服務 Java 方法的,而本地方法堆疊是為虛擬機呼叫 Native 方法服務的;
Java 堆:Java 虛擬機中記憶體最大的一塊,是被所有執行緒共享的,用于存盤實體化物件;
方法區:用于存盤 class檔案,常量 靜態變數與方法
物件的創建的幾種方式
使用new關鍵字
使用Class的newInstance方法
使用Constructor類的newInstance方法
使用clone方法
使用反序列化
為物件分配記憶體的兩種方式 1 指標碰撞 2 空閑列
為什么要進行垃圾回收?
隨著程式的運行,記憶體中存在的實體物件、變數等資訊占據的記憶體越來越多,如果不及時進行垃圾回收,必然會帶來程式性能的下降,甚至會因為可用記憶體不足造成一些不必要的系統例外,
優點: 垃圾回識訓制有效的防止了記憶體泄露,可以有效的使用可使用的記憶體,
大物件直接進入老年代,避免大物件分配記憶體時由于分配擔保機制帶來的復制而降低效率
Java 中都有哪些參考型別?
強參考:發生 gc 的時候不會被回收,
軟參考:有用但不是必須的物件,在發生記憶體溢位之前會被回收,
弱參考:有用但不是必須的物件,在下一次GC時會被回收,
虛參考(幽靈參考/幻影參考):無法通過虛參考獲得物件,用 PhantomReference 實作虛參考,虛參考的用途是在 gc 時回傳一個通知,
怎么判斷物件是否可以被回收?
一般有兩種方法來判斷:
參考計數器法:為每個物件創建一個參考計數,有物件參考時計數器 +1,參考被釋放時計數 -1,當計數器為 0 時就可以被回收,它有一個缺點不能解決回圈參考的問題;
可達性分析演算法:從 GC Roots 作為起點,參考鏈作為路徑,當一個物件到 GC Roots 沒有任何參考鏈相連時,則證明此物件是可以被回收的,
記憶體分配策略
堆記憶體中還要細分為三個區域: ●新生區(伊甸園區) Young/New ●養老區old ●永久區Perm
大物件直接進入老年代 : 需要大量的連續的記憶體空間,為了避免大物件分配記憶體時的分配擔保機制帶來的復制而降低效率
長期存活物件將進入老年代 :物件在伊甸園區分配,經過新生代垃圾回收,物件還存活則會進入幸存者區,并且物件的年齡會+1經過數次GC后,會晉升到老年代
JVM垃圾回收演算法
標記清除
首先標記出所有需要回收的物件,在標記完成后統一回收掉被標記的物件 (老年代)
優點:實作簡單,不需要物件進行移動,
缺點:第一個是執行效率不穩定,第二個是記憶體空間的碎片化問題
標記復制
將可用記憶體按容量劃分為大小相等的兩塊,每次使用其中的一塊,這一塊用完了就將還存活者的物件復制到另一塊上面 (新生代)
優點:按順序分配記憶體即可,實作簡單、運行高效,不用考慮記憶體碎片,
缺點:記憶體縮小到原來的一半.
不過新生代的98%的物件熬不過第一輪收集. 所以eden區和幸存區大小比例是8:1
標記整理
讓所有存活的物件都移向記憶體空間的一端,然后直接清理掉邊界以外的記憶體 (老年代.)
優點:解決了標記-清理演算法存在的記憶體碎片問題,
缺點:仍需要進行區域物件移動,一定程度上降低了效率,
垃圾回收器 作用:釋放和重用資源,
是垃圾回收演算法的具體實作

Serial收集器(復制演算法): 新生代單執行緒收集器,標記和清理都是單執行緒,優點是簡單高效;
ParNew收集器 (復制演算法): 新生代收并行集器,實際上是Serial收集器的多執行緒版本,在多核CPU環境下有著比Serial更好的表現;
Parallel Scavenge收集器 (復制演算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU,吞吐量 = 用戶執行緒時間/(用戶執行緒時間+GC執行緒時間),高吞吐量可以高效率的利用CPU時間,盡快完成程式的運算任務,適合后臺應用等對互動相應要求不高的場景;
Serial Old收集器 (標記-整理演算法): 老年代單執行緒收集器,Serial收集器的老年代版本;
Parallel Old收集器 (標記-整理演算法): 老年代并行收集器,吞吐量優先,Parallel Scavenge收集器的老年代版本;
CMS(Concurrent Mark Sweep)收集器(標記-清除演算法): 老年代并行收集器,以獲取最短回收停頓時間為目標的收集器,具有高并發、低停頓的特點,追求最短GC回收停頓時間,
G1(Garbage First)收集器 (標記-整理演算法): Java堆并行收集器,G1收集器是JDK1.7提供的一個新收集器,G1收集器基于“標記-整理”演算法實作,也就是說不會產生記憶體碎片,
為什么元空間會取代永久代
整個永久代有一個JVM本身設定固定大小的上限,無法進行調整,而元空間使用的是直接記憶體,受本機可用記憶體限制,出現OOM錯誤的幾率大大降低
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274715.html
標籤:java
上一篇:Dubbo原始碼分析
下一篇:JVM類加載器(詳解)
