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 圖形化介面查看記憶體狀態
 
- 調優步驟
 
- 開啟打印 gc log (tomcat加在 JAVA_OPTS裡)
 
- -XX:+PrintGCDetails
 
- -XX:+PrintGCTimeStamps
 
- -XX:+PrintGCDateStamps
 
- -Xloggc:/gc.log
 
- Java內存模型
 
- 每項線程從主內存取得資料副本以便運算,也因此造成多執行續在運算共享變量資料不一致性的問題 , 因此演變至Volatile補足一致性(可見性)問題
 
- 字節碼
 
- # javap -c (簡易)
 
- # javap -v (明細)
 
- Java內存模型的共8種原子操作,取得CPU使用權時才可操作
 
- JMM演變
 
- 演變1 : 透過總線加鎖
 
- 對主存變量Lock/Unlock
 
- 須等線程使用完,其他線程必須等待
 
- 缺點性能太低
 
- 演變2 : MESI一致性協議
 
- 當其中一個線程變更主存的共享變量值 , 透過總線嗅探(監聽)機制通知其他線程
 
- 缺點多線程在經過總線前會有時間差,導致資料不一致
 
- 演變3 : Volatile
 
- 對總線Lock , 共享變量修改完畢後總線Unlock
 
- Volatile符合併發的有序性、可見性  
 
- Volatile不符合併發的原子性
 
 
 
 
          
      
 
  
 
 
 
 
 
 
 
 
 
 
 
沒有留言:
張貼留言