什麼是垃圾
算法
jvm中的垃圾就是指 沒有任何引用指向的一個對象或者是多個對象(多個對象循環引用)併發
如何定位垃圾app
引用計數法:標記對象引用次數,標記爲0,就能夠回收,但沒法解決循環引用多個對象的垃圾狀況jvm
根可達算法:只要對象沒有跟對象引用,就能夠進行垃圾回收ide
Jvm裏什麼是根?測試
棧中的引用對象spa
方法區的常量對象命令行
方法區中的靜態成員orm
nativie原生方法對象
常見的垃圾回收算法有什麼
標記清除:對能夠回收的垃圾進行清除,但清除後內存會產生碎片,位置不能連續
拷貝算法:須要拷貝一分內存空間,把要要回收的那塊空間裏的未回收的copy到新空間進行連續存儲,copy完畢,把要回收的那塊空間總體回收。沒有碎片,可是浪費空間
標記壓縮:每次對垃圾進行標記回收的時候,把存活的對象放到回收的位置,進行一次挪動,這樣雖然每次壓縮都能得到連續的空間,沒有碎片,可是標記壓縮的效率有點低
JVM內存的分代模型
新生代+老年代,部分老的垃圾回收器使用。新的都不用了
新生代+老年代+ 【永久代(1.7)/ 原數據區(1.8)MetaSpace】
永久代與原數據什麼區別?
永久代必須指定大小,設置死了,運行期間若是過多對象,會溢出
元數據區大小無上限(受限於物理內存)
方法區(Method Area)存放在永久代/原數據區
永久代字符串常量放到永久代 1.8 放在堆裏
新生代有eden+2個suvivor區域(s0 s1)
YGC回收後,大部分對象會被回收,活的進入s0
再次YGC,活着的對象進入eden +s0 進入s1
再次YGC,eden+s1 進入s0 (s0 s1 可能頻繁交換copying)
再次YGC,頑固活着(年齡足夠)的對象進入老年代
s區裝不下的狀況下 s區的對象會進入老年代
老年代存放 頑固一直活着的對象,老年代若是滿了會觸發Full Gc
堆內存邏輯分區
常見的垃圾回收器
年輕代回收算法
Serial 年輕代 串行回收
Parallel Scavenge:並行回收,比serial效率高
Parnew:配合CMS的並行回收
老年代回收算法
Serial Old :老年代serial回收算法
Parallel Old:老年代並行回收算法
CMS(Concurrent MarkSweep):老年代併發的,垃圾回收與程序同時運行,墊底STW時間到200ms
G1(STW時間約10ms)
ZGC( STW 時間約1ms) :PKC++
Shenandoah
Eplison
JVM調優的目的:
減小FULLGC
其餘
JDK1.8默認的垃圾回收:PS+parallelOld
MinorGC == YGC
MajorGC == FGC
JVM參數分類
-開頭 :標準參數,全部的HotSpot都支持
-X開頭 :非標準參數,特色版本的HotSpot支持
-XX開頭 :測試參數,將來有可能會被移除
-XX+PrintCommandLineFlags 命令行中打印JVM參數列表
-XX:+PrintFlagsFinal 最終參數值
-XX:+PrintFlagsInitial 默認參數值