JVM技術交流分享 · 第1期

JVM技術每週分享 · 第1期

JVM技術每週分享整理了JVM技術交流羣每週討論的內容,由羣內成員整理歸納而成。如果你有興趣入羣討論,請關注「Java技術精選」公衆號,通過右下角菜單「入羣交流」加我好友,獲取入羣詳情。

SafePoint

safePoint是代碼的特殊位置.發生GC時,jvm要判斷引用關係,引用關係存在OopMap中,不可能每跑一行代碼就生成一個OopMap,這會消耗大量的CPU執行時間和內存,所以jvm會在一些特殊的位置生成OopMap,這些位置就是SafePoint.GC時,jvm發出線程中斷請求,線程只有跑到SafePoint纔會中斷,所以SafePoint不能太少.

線程中斷主要有兩個方式:搶先式中斷 線程收到中斷請求時,判斷在不在safepoint,不在恢復run到safepoint(很少使用) 主動式中斷 線程run的時候輪詢中斷標誌,中斷標誌爲真則處於safepoint.

SafeRegion

當線程正在run的時候,可以響應jvm的中斷請求,跑到SafePoint中斷.但是線程處於wait,blocked,sleep狀態時,是無法跑到SafePoint中斷的.同時這些線程不處於run的狀態,引用關係不會發生變化.於是jvm規定了SafeRegion,無論何時發起GC,處於SafeRegion的線程都是安全的可以直接進行GC的.線程離開SafeRegion會檢查系統是否已經完成了gc,完成可以離開去run,未完成繼續等待可以離開的信號.

CMS內存碎片

CMS (Concurrent Mark Sweep)是一種以獲取最短回收停頓時間爲目標的Tenured generation收集器.CMS採取的是標記清清除算法.該算法是一定會產生內存碎片的,這是無法避免的.致過多的內存碎片會導致給大對象分配內存時,沒有足夠大的連續內存而出發full GC. 於是CMS提供了兩個參數去解決這個問題:

-XX:UseCMSCompactAtFullCollection默認開啓,fullGC時將老年代縮壓縮.

-XX:CMSFullGCsBeforeCompaction 則是代表多少次FGC後對老年代做壓縮操作,默認值爲0,代表每次都壓縮, 把對象移動到內存的最左邊,可能會影響性能,但是可以消除碎片. 即犧牲一定性能在每次GC之後,將存活的對象整理到一塊,消除內存碎片.

parNew+CMS組合 eden的YGC辨別對象的狀態

問題中有個缺陷,當觸發MinorGC時不僅僅是eden區,還會掃描from Survivor 區的內存. ParNew採取的算法是複製清除算法,但是判斷對象是否存活仍是可達性算法,採取對對象進行標記判斷狀態.

常量池

  • 常量池主要分爲兩個: 靜態常量池: *.class的常量池,保存了一些類的描述信息(符號引用-->1.類和方法的全限定名 2.字段的名稱和描述符 3.方法的名稱和描述符),以及一些字面量(1.文本字符串 2.八種基本類型的值 3.被聲明爲final的常量等)
  • 動態常量池: jvm在加載某個類的時候,必須經過裝載、連接、初始化,而連接又包括驗證、準備、解析三個階段。而當類加載到內存中後,jvm就會將class常量池中的內容存放到運行時常量池中,由此可知,運行時常量池也是每個類都有一個.

全局字符串常量池:本質是一個HashSet,這是一個純運行時的結構,而且是惰性維護的。注意它只存儲String對象的引用,而不存儲String對象的內容,根據這個引用可以得到具體的String對象。這個常量池在每個HotSpot VM的實例只有一份,被所有的類共享, JDK6 之前是存放在方法區,JDK7被移到了堆區中.(這裏有很多有意思的點課自行百度)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章