2020/1/29

JVM構造(上)


  • 參考資料
  • JVM
    • Heap堆為JVM主要調優對象 , Full GC會造成STW(stop-the-world),因此Full GC越少越好
      • minor gc : 僅年輕代GC
      • full gc : 年輕代+老年代全局GC
    • Heap預設分配
      • 老年代 2/3
      • 年輕代 1/3
      • Eden 8/10*1/3
      • from 1/10*1/3
      • to 1/10*1/3
    • 倖存下來的對象 , 在from/to間搬移次數達15次,即可放置於老年代 , 如from/to空間不足則立即放置於老年代
    • 可用 ...jdk/bin/jvisualvm 圖形化介面查看記憶體狀態
      • 可另外裝 visual gc
    • 調優步驟
      • 開啟打印 gc log (tomcat加在 JAVA_OPTS裡)
        • -XX:+PrintGCDetails
        • -XX:+PrintGCTimeStamps
        • -XX:+PrintGCDateStamps
        • -Xloggc:/gc.log
  • JMM(Java內存模型)
    • Java內存模型是基於CPU模型之設計
    • Java內存模型
      • 每項線程從主內存取得資料副本以便運算,也因此造成多執行續在運算共享變量資料不一致性的問題 , 因此演變至Volatile補足一致性(可見性)問題
    • 字節碼
      • # javap -c (簡易)
      • # javap -v (明細)
      • Java內存模型的共8種原子操作,取得CPU使用權時才可操作

    • JMM演變
      • 演變1 : 透過總線加鎖
        • 對主存變量Lock/Unlock
        • 須等線程使用完,其他線程必須等待
        • 缺點性能太低
      • 演變2 : MESI一致性協議
        • 當其中一個線程變更主存的共享變量值 , 透過總線嗅探(監聽)機制通知其他線程
        • 缺點多線程在經過總線前會有時間差,導致資料不一致
      • 演變3 : Volatile
        • 對總線Lock , 共享變量修改完畢後總線Unlock
        • Volatile符合併發的有序性、可見性  
        • Volatile不符合併發的原子性

沒有留言:

張貼留言

test2