JVM初識、調優

來源:互聯網
上載者:User

標籤:

JVM是按照運行時資料的儲存結構來劃分記憶體結構的,JVM在運行java時,將他們劃分成幾種不同格式的資料,分別儲存在不同的地區,這些資料統一稱為運行時資料,運行時資料包括java程式本身的資料資訊和JVM運行java需要的額外的資料資訊。
JMM要理解
JVM運行時資料區程式計數器--------線程私人java虛擬機器棧------線程私人本地方法棧--------線程私人Jav堆-------------線程公用方法區------------線程公用
鎖機制
JVM記憶體配置1:棧記憶體配置儲存參數、局部變數、中間計算過程和其他資料。退出方法的時候,修改棧頂指標就可以把棧幀中的內容銷毀棧的優點:存取速度比堆快,僅次於寄存器,棧資料可以共用棧的缺點:存在棧中的資料大小、生存期是在編譯時間就確定的,導致其缺乏靈活性
2:堆記憶體配置堆的優點:動態地分配記憶體大小,生存期不必事先告訴編譯器,他是在運行期動態分配的,記憶體回收行程會自動收走不再使用的空間地區堆的缺點:運行時動態分配記憶體,在分配和銷毀時要佔用時間,因此堆的效率較低
JVM堆結構
JAVA堆結構和記憶體回收
JVM堆配置參數1:-Xms初識堆大小   預設實體記憶體的1/64(<1GB)2:-Xmx最大堆大小   預設實體記憶體的1/4(<1GB),實際中建議不大於4G3:一般建議設定 -Xms=-Xmx   好處是避免每次在gc後,調整堆的大小,減少系統記憶體配置開銷4:整個堆大小=年輕代大小+年老代大小+持久代大小
JVM新生代1、新生代=1個eden區+2個Survivor區2、-Xmn年輕代大小(1.4or later)    -XX:NewSize,-XX:MaxNewSize(設定年輕代大小(for 1.3/1.4))    預設值大小為整個堆的3/83、-XX:NewRatio    年輕代(包括Eden和兩個Suivivor區)與老年代的比值    Xms=Xmx並且設定了Xmn的情況下,改參數不需要進行設定4、-XX:SurvivorRatio    Eden區與 Survivor區的大小比值,設定為8,則兩個Survivor區與一個Eden區的比值是2:8,一個Survivor區占整個年輕代的1/105、用來存放JVM剛分配的JAVA對象
Java老年代1、老年代=整個堆-年輕代大小-持久代大小2、年輕代中經過記憶體回收沒有回收掉的對象,被複製到老年代3、老年代儲存物件比年輕代年齡大的多,而且不乏大的對象4、建立的對象也有可能直接進入老年代   4.1、大對象,可通過啟動參數設定-XX:PretenureSizeThreshold=1024(單位是位元組,預設為0)來代表超過多大時就不在新生代分配,而是直接在年老代分配。(一般情況下建議不設定)   4.2、大的數組對象,且數組中無引用外部對象5、老年代大小無配置參數
Java持久代1、持久代=整個堆-年輕代大小-老年代大小2、-XX:PermSize -XX:MaxPermSize   設定持久代的大小,一般情況推薦把-XX:PermSize設定成XX:MaxPermSize的值為相同的值,因為永久代大小的調整會導致堆記憶體需要觸發fgc3、存放Class、Method元資訊,其大小與項目的規模、類、方法的數量有關。一般設定為128M就足夠,設定原則是預留30%的空間4、永久代的回收方式   4.1、常量池中的常量,無用的類資訊,常量的回收很簡單,沒有引用了就可以被回收   4.2、對於無用的類進行回收,必須保證3點:       類的所有執行個體都已經被回收       載入類的ClassLoader已經被回收       類對象的Class對象沒有被引用(即沒有通過反射引用該類的地方)
JVM記憶體記憶體回收JVM垃圾收集演算法1、引用計數演算法   每個對象有一個引用技術屬性,新增一個引用時計數加1,引用釋放時計數減1,計數為0時可以回收。此方法簡單,無法解決對象相互循環參考的問題。還有一個問題就是如何解決精確計數。這個已經pass不再使用。2、根搜尋演算法   從GC Roots開始向下搜尋,搜尋所走過的路徑稱為引用鏈。當一個對象到GC Roots沒有任何引用鏈的時候,則證明此對象是停用。不可達對象。在JAVA語言中GC Roots包括:虛擬機器棧中引用的對象方法區中類靜態屬性實體引用的對象方法區中常量引用的對象本地方法中JNI引用的對象
JVM記憶體回收演算法1、複製演算法(Copy)       複製演算法採用從根集合掃描,並將存活對象複製一塊新的,沒有使用過的空間中,這種演算法當空間存活的對象比較少時,極為高效,但是帶來的成本是需要一塊記憶體交換空間用於就kin型對象的移動   此演算法用於新生代記憶體回收,從E區回收到S0或者S12、標記清除演算法(Mark-Sweep)     標記-清除演算法採用從根集合進行掃描,對存活的對象標記,標記完畢後,在掃描整個空間中未被標記的對象,進行回收。  標記-清除演算法不需要進行對象的移動,並且僅對不存活的對象進行處理,在存活對象比較多的情況下極為高效,但由於標記-清除演算法回收不存活的對象,因此會造成記憶體片段。3、標記整理壓縮演算法(Mark-Compac)    標記-整理演算法採用標記-清除演算法一樣的方式進行對象的標記,但在清除時不同,在回收不存活的對象佔用的空間後,會將所有的存活對象往左端空閑空間移動,並更新對應的指標,標記-整理演算法是在標記清除演算法的基礎上,又進行了對象的移動,因此成本高,但是卻解決了記憶體片段的問題。名詞解釋1、串列回收   GC單線程記憶體回收、會暫停所有使用者線程2、並行回收   收集是指對個GC線程並行工作,但此時使用者線程是暫停,所以,Serial是串列的,Parallel收集器是並行的,而CMS收集器是並發的。3、並發回收   是指使用者線程與GC線程同時執行(不一定是並行,可能交替,但總體上是在同時執行的),不需要停頓使用者線程,(其實在CMS中使用者線程還是需要停頓的,只是非常的短,GC線程在另一個CPU上執行)
Serial回收器(串列回收器)1、是一個單線程的收集器,只能使用一個CPU或一條線程去完成垃圾收集;在進行垃圾收集時,必須暫停所有其他背景工作執行緒,直到收集完成。2、缺點:Stop-The-World3、優勢:簡單。對於單CPU的情況,由於沒有線程互動開銷,反而可以更高效。是Client模式下預設的新生代收集器。
新生代Serial回收器1、-XX:+UserSerialGC來開啟   Serial New+Serial Old的收集器組合進行記憶體回收2、使用複製演算法3、獨佔式的記憶體回收   一個線程進行GC,串列,其他背景工作執行緒暫停。老年代Serial回收器1、-XX:+UserSerialGC來開啟   Serial New+Serial Old的收集器組合進行記憶體回收2、使用標記-壓縮演算法3、串列的、獨佔式的記憶體回收行程   因為記憶體比較大原因,回收比新生代慢
ParNew回收器(並行回收器)
並行回收器也是獨佔式的回收器,在收集過程中,應用程式會全部暫停。但是由於並行回收器使用多線程進行記憶體回收,因此,在並發能力比較強的CPU上,它產生的停頓時間要短於串列回收器,而在單CPU上或者並發能力較弱的系統中,並行回收器的效果不會比串列回收器好,由於多線程的壓力,他的實際表現很可能比串列回收器差。新生代ParNew回收器1、-XX:UserParNewGC開啟   新生代使用並行回收收集器,老年代使用串列收集器2、-XX:ParallelGCThreads 指定線程數   預設最好與CPU數量相當,避免過多的線程數影響垃圾收集效能3、使用複製演算法4、並行的、獨佔式的記憶體回收行程新生代Parallel Scavenge回收器1、輸送量優先回收器   關注CPU輸送量,即運行使用者代碼的時間/總時間,比如:JVM運行100分鐘,其中運行使用者代碼99分鐘,垃圾收集1分鐘,則輸送量是99%,這種收集器能最高效的利用CPU,適合運行後台運算。2、-XX:+UserParallerGC開啟   使用Paraller Scavenge+ Serrial Old收集器組合回收垃圾,這也是在Server模式下的預設值3、-XX:GCTimeRadio   來設定使用者執行時間佔總時間的比例,預設99,即1%的時間用來記憶體回收4、-XX:MaxGCPausMillis   設定GC的最大停頓時間5、使用複製演算法老生代Parallel Old回收器1、-XX:+UserParallerOldGC開啟   使用Parallel Scavenge +Parallel Old組合收集器進行收集2、使用標記整理演算法3、並行的、獨佔式的記憶體回收行程。
CMS(並發標記清除)回收器運行過程分為4個階段:    初識標記:只標記GC Roots能直接關聯到的對象    並發標記:進行GC Roots Tracing的過程    重新標記:修正並發標記期間因使用者程式繼續運行而導致標記發生改變的那一部分對象的標記    並發清除:其中標記和重新標記兩個階段仍然需要Stop-The-World,整個過程中耗時最長的並發標記和並發清除過程中收集器都可以和使用者線程一起工作。
CMS(並發標記清除)回收器


GC效能指標輸送量    應用花在非GC上的時間百分比GC負荷    與輸送量相反,指應用花在GC上的時間百分比暫停時間  應用花在GC stop-the-world的時間GC頻率反應速度  從一個對象變成垃圾到這個對象被回收的時間一個互動應用要求暫停時間越少越好,然而,一個非交換性的應用,當然是希望GC符合越低越好。一個即時系統對暫停時間和GC負荷的要求,都是越低越好。
記憶體容量配置原則1、年輕代大小選擇   回應時間優先的應用:儘可能設定大些,直到接近系統的最低回應時間限制(根據實際情況選擇)在此種情況下,年輕代收集發生的頻率也是最小的,同時減少老年代的對象   輸送量優先的應用:儘可能的設定大,可能到達Gbit的程度,因為對回應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用   避免設定過小。當新生代設定過小時會導致:       1、YGC次數更加頻繁       2、可能導致YGC對象直接進入老年代,如果老年代滿了,會觸發FGC。老年代大小選擇   回應時間優先的應用:老年代使用並發收集器,所以其大小需要小心設定,一般要考慮並發會話率和會話期間等一些參數,如果堆設定小了,可以會造成記憶體片段,高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間,最佳化的方案,一般需要參考以下資料獲得:並發垃圾收集資訊、持久代並發收集次數、傳統GC資訊、花在年輕代和年老代回收上的時間比例   輸送量優先的應用:一般輸送量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是:可以儘可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。


























來自為知筆記(Wiz)

JVM初識、調優

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.