




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、jvm調優其實就是對Young代的次數與時間調優最近在做埋點監控,做到jvm這一塊。剛好可以理一下思路:看過很多jvm理論的文章,總覺得講得太復雜了,但用來也就那么幾個參數。so,化繁為簡,只記我要用的。1為什么會00M溢出,是持久代滿了。2堆與棧(非堆no-heap)區別,堆主要用于存儲new信息,棧用于線程開銷,通過jstatpid100s查看棧的一般都是水平的趨勢。3.堆又分eden,survivor區,由eden向survivorcopy.常常說的調優,主要是對針gc次數,時間,而這一塊主要集中在Yong代,而設置的-xmx(最大),-xms(最小)的大小又與gc的頻率與次數有關。gc
2、回收機制常用的有五種,可以組合使用jvm不復雜,設置內存最大小值,線程數據,持久代數據,真正考驗功力的是根據不同的使用場景選用合適的gc回收機機制,合理設置內存,線程,持久代數據6.jstat的用法IC1M個W7M3DWIAK1WICcOMCiIQDftJOIGUTiDDI啦沏IWM4ICdH沏IDUDICdMOTDrtB個1DHL3D1HDQDD1D.DQ3IQdlFflO1Qfi.m1030llhKHIDtl&DOIDtl&XlUlDfrlfiIQdQKHIfrOI即咖IDtfftDQMtfBSHAurrMflpumSiHhwIKOtiXl1HM30ICtlOI測加IMcQOIHD&30I
3、ttMOIfrOTMIQlUC#(/以下是選用別的人作為參考理JVM學習筆記之JVM內存管理和JVM垃圾回收的概念,JVM內存結構由堆、棧、本地方法棧、方法區等部分組成,另外JVM分別對新生代和舊生代采用不同的垃圾回收機制。首先來看一下JVM內存結構,它是由堆、棧、本地方法棧、方法區等部分組成,結構圖如下所示。JVM學習筆記JVM內存管理和JVM垃圾回收JVM內存組成結構JVM內存結構由堆、棧、本地方法棧、方法區等部分組成,結構圖如下所示:1)堆所有通過new創建的對象的內存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被劃分為新生代和舊生代,新生代又被進一步劃分為Eden和Surv
4、ivor區,最后Survivor由FromSpace和ToSpace組成,結構圖如下所示:SurvivorRatioOldGenerationPermanentSpacePerm-aneniGeneration新生代。新建的對象都是用新生代分配內存,Eden空間不足的時候,會把存活的對象轉移到Survivor中,新生代大小可以由-Xmn來控制,也可以用-XX:SurvivorRatio來控制Eden和Survivor的比例舊生代。用于存放新生代中經過多次垃圾回收仍然存活的對象2)棧每個線程執行每個方法的時候都會在棧中申請一個棧幀,每個棧幀包括局部變量區和操作數棧,用于存放此次方法調用過程中的臨
5、時變量、參數和中間結果3)本地方法棧用于支持native方法的執行,存儲了每個native方法調用的狀態4)方法區存放了要加載的類信息、靜態變量、final類型的常量、屬性和方法信息。JVM用持久代(PermanetGeneration)來存放方法區,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值。介紹完了JVM內存組成結構,下面我們再來看一下JVM垃圾回收機制。JVM垃圾回收機制JVM分別對新生代和舊生代采用不同的垃圾回收機制新生代的GC:新生代通常存活時間較短,因此基于Copying算法來進行回收,所謂Copying算法就是掃描出存活的對象,并復制到一塊
6、新的完全未使用的空間中,對應于新生代,就是在Eden和FromSpace或ToSpace之間copy。新生代采用空閑指針的方式來控制GC觸發,指針保持最后一個分配的對象在新生代區間的位置,當有新的對象要分配內存時,用于檢查空間是否足夠,不夠就觸發GC。當連續分配對象時,對象會逐漸從eden到survivor,最后到舊生代,用javavisualVM來查看,能明顯觀察到新生代滿了后,會把對象轉移到舊生代,然后清空繼續裝載,當舊生代也滿了后,就會報outofmemory的異常,如下圖所示:rfern-CtEipileline:2L75canpiles-1.321eAlL1L1ALJU1.J1J1L
7、11L1MCltsELoaderTime:3106ltidel,Eiunloidei-6.T56sGCTine;39Dco口EEtionE,1.449sLastC&use;ilrIx4wt.r4Space(11STEM,15D0M):1.D37M,3關eollecbL.!83s:SnrriTsrC(1.438比192.D00I0:0idJLt:.db.luAJli.kXa.-Eurdvor1lDOOK):tl4.rg7K.二dJLxllj1u.-jjj.-x1llljjJ.!.jl1jAxjJ.lxlLXjA.iAiALA.iAjj.xxILljjjAx-XjjJ-lljjLllAAu.Llj
8、-lLLLxj.xllLlAulAjlAiAi-OilGen(ITT.250(1,Z2.1BSH):16.819M,1265.862hE-FtrmGen$4.G0(MJH.7ank14.523M在執行機制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew)串行GC在整個掃描和復制過程采用單線程的方式來進行,適用于單CPU、新生代空間較小及對暫停時間要求不是非常高的應用上,是client級別默認的GC方式,可以通過-XX:+UseSerialGC來強制指定并行回收GC在整個掃描和復制過程采用多線程的方式來進行,適用于多CPU、對暫
9、停時間要求較短的應用上,是server級別默認采用的GC方式,可用-XX:+UseParallelGC來強制指定,用-XX:ParallelGCThreads=4來指定線程數并行GC與舊生代的并發GC配合使用舊生代的GC:舊生代與新生代不同,對象存活的時間比較長,比較穩定,因此采用標記(Mark)算法來進行回收,所謂標記就是掃描出存活的對象,然后再進行回收未被標記的對象,回收后對用空出的空間要么進行合并,要么標記出來便于下次進行分配,總之就是要減少內存碎片帶來的效率損耗。在執行機制上JVM提供了串行GC(SerialMSC)、并行GC(parallelMSC)和并發GC(CMS),具體算法細節
10、還有待進一步深入研究。以上各種GC機制是需要組合使用的,指定方式由下表所示:指定肓式新生代舊生代GC方式-XX:+UseSerialGC串行G匚串行GC-XX:刖謝GC并行回收GC并行GC-XX:+UseConeMarkSweepGC并行GC并發GC-XX:+UseParJewGC并行X串行GC-XX:+UseParallelOldGC并行回收GC并行GC-XX;+UseConeMarkSweepGC-XX:+UseParrJewGC串行GC并發GC不支持的組合-XX:-UseParNewGC-XX:KJseParallellOldGC2、-XX:-UseParNewGC-XX:+UseSer
11、1alGCjstate用法:Jstat是JDK自帶的一個輕量級小工具。全稱JavaVirtualMachinestatisticsmonitoringtool,它位于java的bin目錄下,主要利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heapsize和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用。由于JVM內存設置較大,圖中百分比變化不太明顯一個極強的監視VM內存工具。可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量。jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時
12、,需加上查看進程的進程id,和所選參數。執行:cd$JAVA_HOME/bin中執行jstat,注意jstat后一定要跟參數。語法結構:Usage:jstat-help|-optionsjstat-t-h參數解釋:Options選項,我們一般使用-gcutil查看gc情況vmidVM的進程號,即當前運行的java進程號intervals|ms間隔時間,單位為秒或者毫秒,默認為ms。必須是正整型。count打印次數,如果缺省則打印無數次輸出參數:-hn每個n行輸出一次列表頭。默認為0,僅輸出一次。-tn在第一列輸出時間戳。該時間戳從jvm啟動開始。-JjavaOption具體參數:-class:
13、統計classloader行為信息-compiler:統計編譯行為信息-gc:統計jdkgc時heap信息-gccapacity:統計不同的generations(新生代、老生代、永久代)相應的heap容量信息-gccause:統計gc的情況,以及引起gc的事情。同-gcutil-gcnew:統計新生代的gc情況-gcnewcapacity:統計新生代gc時heap的容量信息-gcold:統計老生代的gc情況-gcoldcapacity:統計老生代gc時heap容量信息-gcpermcapacity:統計永久代gc時的容量信息-gcutil:統計heap的gc情況-printcompilati
14、on:沒用過jstat-gcutil:結果信息:Heap上的Survivorspace0區已使用空間的百分比Heap上的Survivorspace1區已使用空間的百分比EHeap上的Edenspace區已使用空間的百分比OHeap上的Oldspace區已使用空間的百分比PPermspace區已使用空間的百分比YGC從應用程序啟動到采樣時發生YoungGC的次數YGCT-從應用程序啟動到采樣時YoungGC所用的時間(單位秒)FGC從應用程序啟動到采樣時發生FullGC的次數FGCT-從應用程序啟動到采樣時FullGC所用的時間(單位秒)GCT從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒)
15、jstat-gcutil21891250721891進程號;250ms采樣interval;7countS0S1EOPYGCYGCTFGCFGCTGCT12.440.0027.209.4996.70780.17650.4950.67212.440.0062.169.4996.70780.17650.4950.67212.440.0083.979.4996.70780.17650.4950.6720.007.740.009.5196.70790.17750.4950.6730.007.7423.379.5196.70790.17750.4950.6730.007.7443.829.5196.70
16、790.17750.4950.6730.007.7458.119.5196.71790.17750.4950.673以上輸出表明:1.在第三行與第四行,發生一次新生代gc。本次gc耗時0.001秒,且有對象從Eden區提升到老生代,老生代使用率從9.49%上升到9.51%。2.gc之前,survivorspace使用率12.44%,gc后,降為7.74%。jstat-gcnew-h321891250-h3:每隔三行輸出一次列表頭;21891:進程號;250:interval采樣間隔,ms;count不設置,表示打印無數次S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.064
17、.00.031.7313132.0512.0178.62490.20364.064.00.031.7313132.0512.0355.52490.20364.064.035.40.023132.0512.021.92500.204S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.064.035.40.023132.0512.0245.92500.20464.064.035.40.023132.0512.0421.12500.20464.064.00.019.0313132.0512.084.42510.204S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.
18、064.00.019.0313132.0512.0306.72510.204以上輸出表明:SOU:survivorspace0utilizationDSS:desiredsurvivorSizeTT:tenuringthreshold閥值,用于控制對象在新生代存活的最大次數第二行和第三行之間,發生一次新生代gc。耗時為0.001秒。本次gc發現較多的存活對象,且S0U超過了DSS,因此,將存活對象提升到老生代(這里沒有顯示)。并將TT從31降到2.另一次gc發生在第5行和第6行,本次gc發現較少的幸存對象,并將閥值變更為31。jstat-gcoldcapacity-t218912503150.
19、11408.060544.011696.011696.0194802.8743.799150.41408.060544.013820.013820.0194812.9383.863150.71408.060544.013820.013820.0194812.9383.863-t:在第一列輸出時間戳;21891:進程號;250:采樣間隔ms;3采樣次TimestampOGCMNOGCMXOGCOCYGCFGCFGCTGCT以上輸出表明:1.OGC:oldgenerationcapacity老生代空間大小OGCMN:最小OGCOGCMX:最大OGCOC:oldspacecapacityFGC:Fu
20、llGCOGC:oldgenerationcapacityTimestamp從jvm啟動的時間開始。第二行和第三行,經過81次fullgc,OGC從11696KB上升到13820KB。老生代最大空間大小OGCMX為60544KB,因此還有上升空間。jstat-gcutilrootlocalhostbin#jstat-gcutil2544410005S0S1EOPYGCYGCTFGCFGCTGCT73.540.0099.0467.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.58373.540.0099.046
21、7.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.583可以看到,5次younggc之后,垃圾內存被從Edenspace區(E)放入了Oldspace區(O),并引起了百分比的變化,導致Survivorspace使用的百分比從73.54%(S0)降到0%(S1)。有效釋放了內存空間。綠框中,我們可以看到,一次fullgc之后,Oldspace區(O)的內存被回收,從99.05%降到67.52%。圖中同時打印了younggc和
22、fullgc的總次數、總耗時。而,每次younggc消耗的時間,可以用相間隔的兩行YGCT相減得到。每次fullgc消耗的時間,可以用相隔的兩行FGCT相減得到。例如紅框中表示的第一行、第二行之間發生了1次younggc,消耗的時間為0.252-0.252=0.0秒。常駐內存區(P)的使用率,始終停留在98.49%左右,說明常駐內存沒有突變,比較正常。如果younggc和fullgc能夠正常發生,而且都能有效回收內存,常駐內存區變化不明顯,則說明java內存釋放情況正常,垃圾回收及時,java內存泄露的幾率就會大大降低。但也不能說明一定沒有內存泄露。GCT是YGCT和FGCT的時間總和。以上,
23、介紹了Jstat按百分比查看gc情況的功能。其實,它還有功能,例如加載類信息統計功能、內存池信息統計功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不做介紹。jstat-classpid顯示加載class的數量,及所占空間等信息。rootlocalhostbin#jstat-class25917LoadedBytesUnloadedBytesTime26292916.82924.60.90jstat-compilerpid顯示VM實時編譯的數量等信息。rootlocalhostbin#jstat-compiler25917CompiledFailedInvalidTimeFailedT
24、ypeFailedMethod768000.700jstat-gccapacity可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推,OC是old內純的占用量。rootlocalhostbin#jstat-gccapacity25917TOC o 1-5 h zNGCMN640.0NGCMX4992.0NGC832.0S0C64.0S1C64.0EC704.0OGCMN1408.0OGCMX60544.0OGC9504.0OC9504.0OC是old內純的占用量PGCMN8192.0PGCMN顯示的是最小perm的內存使用量PGCMX65536.0PGCMX顯示的是perm的內存最大使用量PGC12800.0PGC是當前新生成的perm內存占用量PC12800.0PC是但前perm內存占用量YGC164FGC6jstat-gcnewpidnew對象的信息rootlocalhostbin#jstat-gcnew25917SOCS1CSOUS1UTTMTTDSSECEUYGCYGCT64.064.047.40.021532.0704.0145.71680.254jstat-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 歷史焦點人物康熙帝研究
- 自動控制技術的應用與發展故事
- 機場商業投訴管理辦法
- 煤礦突發事故應急預案
- 特種設備安全法相關法規
- 班組安全培訓
- 杭州稅務稽查管理辦法
- 新產品開發流程的標準化與優化
- 知識競賽具體方案
- 安全生產穩定
- 2023年醫技類-康復醫學(副高)考試歷年真題薈萃帶答案
- 改進維持性血液透析患者貧血狀況PDCA
- 公司崗位職級管理制度
- 漏肩風(肩周炎)中醫臨床路徑及入院標準2020版
- 光面爆破知識講座課件
- 高鐵站裝飾裝修方案
- DB4401-T 112.1-2021 城市道路占道施工交通組織和安全措施設置+第1部分:交通安全設施設置-(高清現行)
- 質量整改通知單(樣板)
- 杭州市高級中學2022年高一新生素質測試(分班考)模擬試卷
- 《碳纖維片材加固混凝土結構技術規程》(2022年版)
- 智能建筑項目設計方案(模板)
評論
0/150
提交評論