知識點:
1)什麼是JVM
2)運行時數據區
3)內存模型
4)垃圾收集器html
建議書籍:
《深刻理解java虛擬機》
這本書建議是具有必定java能力的同窗進階必看的書籍。java
什麼是jvm算法
爲何要學習JVM?
當咱們出現內存泄漏和內存溢出的時候,因爲內存都是被JVM管理,因此咱們必需要去了解這塊內容。windows
運行時數據區多線程
java代碼無非就是數據,指令,控制。
1)程序計數器:指向當前線程正在執行的字節碼指令的地址 行號
2)虛擬機棧 存儲當前線程運行方法所須要的數據,指令,返回地址
局部變量表 操做數棧 動態連接 出口等等
3)本地方法棧 本地方法native
4) 方法區: 類信息 常量(1.7) 靜態變量 JIT
5)堆 : 存放對象實例併發
1.8之前的版本oracle
1.8以後eclipse
永久代存在在方法區jvm
meta space 在直接內存中jsp
新生代回收算法:複製回收算法
採起8:1:1的話那麼只浪費10%
對象的生命週期不同--》分代
98%在minor gc的時候會被回收掉 【minor gc 清理的是eden區】
s1放不下 分配擔保 由咱們老年代來擔保
理想狀況下應該避免對象進入老年代
【major gc 清理的是老年代,咱們要儘可能避免使用majorgc,由於這個比minor gc 慢十倍】
默認的JVM參數:
新生代:老年代 1:2
什麼樣的對象應該被gc
1)引用計數法
2)可達性分析法
能夠做爲GC root對象:
虛擬機棧中本地變量表引用的對象
方法區
- 類靜態變量引用的對象
- 常量引用的對象
本地方法棧中JNI引用的對象
不可達是否是就必定會被回收
finalize() 挽救一次
舉例: Object obj=new Object();
官網查看各類配置參數
www.oracle.com/technetwork… 注意看這句
參數解釋
-Xms20M starting 堆的起始大小
-Xmx max 堆的最大大小
-Xmn new 堆的新生代大小
新生代比例參數設置 默認是8:1:1
-XX:SurvivorRatio=8
指針碰撞和棧上分配
棧上分配 -XX:+/-UserTLAB (Thread Local Allocation Buffer)
Free List 空閒列表
先掌握一些經常使用的概念和配置
對象很大
-XX:PretenureSizeThreshold=3145728 【3M】
ps:
當建立的對象超過指定大小時,直接把對象分配在老年代中。
-XX:PretenureSizeThreshold=3145728 參數設定超過對象超過多少時,分配到老年代中,此例爲3M(310241024)。
長期存活的對象【屢次minor gc】 每次gc存活都有一個年齡+1 默認是15
-XX:MaxTenuringThreshold=1
ps:
這邊設置一個撐過多少minor gc的對象可以放入老年代
動態對象年齡判斷
相同年齡全部對象的大小總和> survivor空間大小的一半 這些對象直接晉級到老年代
分配擔保
minor GC 判斷老年代是否有空間
老年代最大可用連續空間是否 > 新生代全部對象總空間
劃分GC的緣由是由於不一樣的gc分代效率的問題
minor GC
major GC
full GC
何時可能觸發Full GC呢
1)Perm空間不足;
2)CMS GC出現了promotion failed和concurrent mode failure 。
concurrent mode failure發生的緣由通常是CMS正在進行,可是因爲老年代空間不足,須要儘快回收老年代裏面的再也不被使用的對象,這時中止全部的線程,同時終止CMS,直接進行Serial Old GC
3)統計獲得的Young GC晉升到老年代的平均大小大於老年代的剩餘空間
4)主動觸發Full GC(執行jmap -histo:live [pid])來避免碎片問題
引用:
強引用 Object obj=new Object() gcroot 可達
軟引用 SoftReference
弱引用
虛引用
判斷對象是否須要被回收
1)引用計數法 【沒法解決對象互相引用的問題】
2)可達性分析法
垃圾回收算法:
1)標記清除
2)複製回收
3)標記整理
4)分代收集
垃圾收集器
上三個 複製回收算法
1)Serial 單線程 Stop The World
2)ParNew 多線程
-XX:ParallelGCThreads
3)Parallel Scavenge
吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾回收時間)
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
-XX:UseAdaptiveSizePolicy
4)CMS
標記-清除算法
減小回收停頓時間
初始標記-併發標記-從新標記-併發清除
-XX:+ UseCMSCompactAtFullCollection Full GC後,進行一次碎片整理;整理過程是獨佔的,會引發停頓時間變長
-XX:+CMSFullGCsBeforeCompaction 設置進行幾回Full GC後,進行一次碎片整理
-XX:ParallelCMSThreads 設定CMS的線程數量(通常狀況約等於可用CPU數量)
5)Serial Old
CMS的備用預案 Full GC 老年代已經塞滿了 分配擔保沒有空間
標記整理算法
6)Parallel Old
標記整理算法
7)G1
相比於cms 可以處理浮動垃圾
回收的時間節點
如何查看當前的垃圾回收器
-XX:+PrintFlagsFinal
-XX:+PrintCommandLineFlags
server client
MBean
GC日誌
1.輸出日誌
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/home/administrator/james/gc.log
-XX:+PrintHeapAtGC
2.日誌文件控制
-XX:-UseGCLogFileRotation
-XX:GCLogFileSize=8K
3.怎麼看
JDK自帶的 監控工具
docs.oracle.com/javase/8/do…
jmap -heap pid 堆使用狀況
jstat -gcutil pid 1000
jstack 線程dump
jvisualvm
jconsole
MAT
help.eclipse.org/oxygen/inde…
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/administrator/james/error.hprof
懷疑:
1.看GC日誌 126719K->126719K(126720K)
2.dump
3.MAT
1.佔用Retained Heap
2.看有沒有GC Root指向