JVM 前戲

什麼是垃圾
算法

jvm中的垃圾就是指 沒有任何引用指向的一個對象或者是多個對象(多個對象循環引用)併發

如何定位垃圾app

  • 引用計數法:標記對象引用次數,標記爲0,就能夠回收,但沒法解決循環引用多個對象的垃圾狀況jvm

  • 根可達算法:只要對象沒有跟對象引用,就能夠進行垃圾回收ide



Jvm裏什麼是根?測試

  1.  棧中的引用對象spa

  1. 方法區的常量對象命令行

  1. 方法區中的靜態成員orm

  1. nativie原生方法對象

常見的垃圾回收算法有什麼

  1. 標記清除:對能夠回收的垃圾進行清除,但清除後內存會產生碎片,位置不能連續

圖片


  1. 拷貝算法:須要拷貝一分內存空間,把要要回收的那塊空間裏的未回收的copy到新空間進行連續存儲,copy完畢,把要回收的那塊空間總體回收。沒有碎片,可是浪費空間


圖片


  1. 標記壓縮:每次對垃圾進行標記回收的時候,把存活的對象放到回收的位置,進行一次挪動,這樣雖然每次壓縮都能得到連續的空間,沒有碎片,可是標記壓縮的效率有點低


JVM內存的分代模型

  1. 新生代+老年代,部分老的垃圾回收器使用。新的都不用了

  1. 新生代+老年代+ 【永久代(1.7)/ 原數據區(1.8)MetaSpace】

    • 永久代與原數據什麼區別?

    • 永久代必須指定大小,設置死了,運行期間若是過多對象,會溢出

    • 元數據區大小無上限(受限於物理內存)

    • 方法區(Method Area)存放在永久代/原數據區

    • 永久代字符串常量放到永久代 1.8 放在堆裏

  1. 新生代有eden+2個suvivor區域(s0 s1)

    • YGC回收後,大部分對象會被回收,活的進入s0

    • 再次YGC,活着的對象進入eden +s0 進入s1

    • 再次YGC,eden+s1 進入s0   (s0 s1 可能頻繁交換copying)

    • 再次YGC,頑固活着(年齡足夠)的對象進入老年代

    • s區裝不下的狀況下 s區的對象會進入老年代

  1. 老年代存放 頑固一直活着的對象,老年代若是滿了會觸發Full Gc

堆內存邏輯分區 


常見的垃圾回收器


年輕代回收算法

  1. Serial 年輕代 串行回收

  1. Parallel Scavenge:並行回收,比serial效率高

  1. Parnew:配合CMS的並行回收

老年代回收算法

  1. Serial Old :老年代serial回收算法

  1. Parallel Old:老年代並行回收算法

  1. CMS(Concurrent MarkSweep):老年代併發的,垃圾回收與程序同時運行,墊底STW時間到200ms

  1. G1(STW時間約10ms)

  1. ZGC( STW 時間約1ms) :PKC++

  1. Shenandoah

  1. Eplison

JVM調優的目的:

  1. 減小FULLGC

其餘

  • JDK1.8默認的垃圾回收:PS+parallelOld   

  • MinorGC == YGC

  • MajorGC == FGC

JVM參數分類

-開頭 :標準參數,全部的HotSpot都支持
-X開頭 :非標準參數,特色版本的HotSpot支持
-XX開頭 :測試參數,將來有可能會被移除 

-XX+PrintCommandLineFlags  命令行中打印JVM參數列表

-XX:+PrintFlagsFinal 最終參數值

-XX:+PrintFlagsInitial    默認參數值

相關文章
相關標籤/搜索