1. 程式人生 > 實用技巧 >JVM學習筆記

JVM學習筆記

java常用指令:

檢視位元組碼指令:

javap -c helloworld.class > helloworld.txt

檢視Java程序使用垃圾回收器相關資訊指令:

第一步:通過JPS -l 可以獲取需要查詢java程序號;

第二步:jinfo -flag UserConCMarkSweepGC 程序號。備註:檢視該程序是否採用的是CMS收集器

類載入機制:

雙親委派模式:

Run-Time Data Areas 執行時資料區域:

JVM Stacks 工作原理:

JVM物件記憶體佈局:

JVM記憶體模型:

Heap 記憶體中Old、Young(Eden、S0【From】、S1【To】)說明:

Eden:S0:S1 = 8:1:1 ,因為大部分物件都是“朝生夕死”

Young區包含:Eden和S區:Minor GC

Old區:Major GC,Major GC 通常伴隨Minor GC,也就是觸發Full GC

Young + Old = Full GC

每次GC都會TSW(The Stop World),暫停所以使用者執行緒。儘量少些觸發Full GC(減少Full GC的觸發頻率)

S0和S1保證每次都有一個是空閒的,可以避免記憶體不連續(記憶體碎屏)而導致浪費,採用的是複製演算法。

每次GC,物件的年齡都會+1,預設老年代的年齡>15歲。

Heap 記憶體物件申請與GC觸發流程:

GC ROOT:

判斷GC ROOT 兩種策略:1.引用計數;2.可達性分析,由它出發,某個物件是否可達。一般都是採用可達性分析。

a.虛擬機器棧的本地變數

b.static 變數、常量引用

c.本地方法中的變數【Thread:C】

d.Thread java執行緒

c.類載入器:如果它找到一條線路,能夠到底某個物件,這個物件也不能稱為垃圾。

GC垃圾回收演算法

1.標記---清除

2.標記---整理

3.複製演算法

GC垃圾收集器,主要是針對垃圾回收演算法的應用

1.新生代:Serial、ParNew、Parallel Scavenge、G1

Serial 單執行緒

ParNew 多執行緒(併發)

Parallel Scavenge 多執行緒,並關注“吞吐量”,吞吐量=使用者應用執行時間/業務程式碼執行時間+垃圾收集的時間

以上收集器都是採用的複製演算法:適用記憶體中活躍的物件越少,減輕複製的成本,因為新生代中大多數物件都是“朝生夕死”。

2.老年代:Serial Old、Parallel Old、CMS(concurrent mark sweep---關注“停頓時間”)、G1

Serial Old 單執行緒

Parallel Old 多執行緒、吞吐量等

CMS 併發收集器,使用者執行緒和垃圾執行緒一起執行(CPU切換)

以上收集器採用的是標記-整理/清楚演算法。

對堆進行重新佈局,平分大小統稱為Region 區域,邏輯上還是有Old、Eden、S0、S1區別,物理上已經不是隔離的。

CMS和G1收集器的說明:

CMS:比較關注的是停頓時間---降低吞吐量的要求

G1:可以設定使用者停頓時間,比如:set pause time = 15ms

JVM調優:

(1)、GC收集器:停頓時間和吞吐量

停頓時間[set pause time]:垃圾收集器進行垃圾回收Client執行響應的時間---->使用者端很好的體驗--->適用於使用者互動場景比較頻繁,eg:web 應用。

吞吐量:執行使用者程式碼時間/(執行使用者程式碼時間+垃圾收集器執行時間 ),適用於使用者程式碼執行佔用CPU資源的時間比較大,比如:跑任務,運算的任務。

停頓時間比較小:CMS和G1(set pause time,not strict 15ms) 適用於Web應用---->併發類收集器

吞吐量優先:Parallel Scavenge 和Parallel Old ----->並行類收集器

竄行收集器:Serial 和Serial Old ------>記憶體比較小,嵌入式的裝置

(2)、記憶體使用的維度