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不符合併發的原子性
沒有留言:
張貼留言