版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)
二月23黃國慶重慶市擎天博元科技有限公司2023/2/4MetarnetTechnologiesCo.,Ltd.2JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)
主要內(nèi)容什么是JVMJVM內(nèi)存模型內(nèi)存分配垃圾回收監(jiān)控實例配置實例2023/2/4MetarnetTechnologiesCo.,Ltd.3JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)什么是JVM?基本上來說,JVM是一個虛擬運行環(huán)境,對于字節(jié)碼來說就像是一個機器一樣,可以執(zhí)行任務(wù),并通過底層實現(xiàn)執(zhí)行內(nèi)存相關(guān)的操作。JVM使Java程序做到了“一次編寫,到處運行”。JVM解放了程序員,使程序員不必再關(guān)系對象的生命周期,使程序員不必再關(guān)心應(yīng)該在何時釋放內(nèi)存。可以將JVM當(dāng)做是一種專為Java而生的特殊的操作系統(tǒng),它的工作是管理運行Java應(yīng)用程序的運行時環(huán)境。2023/2/4MetarnetTechnologiesCo.,Ltd.4JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)什么是OOM?out-of-memory系統(tǒng)無法為新線程和新對象分配空間“堆”滿了,垃圾回收不成功影響:業(yè)務(wù)宕機2023/2/4MetarnetTechnologiesCo.,Ltd.5JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型各個年代:新生代(YoungGeneration)伊甸園空間(Eden
)、幸存者空間(Survivor
)最新被創(chuàng)建的對象會被分配到這里,由于大部分對象在創(chuàng)建后會很快變得不可到達,所以很多對象被創(chuàng)建在新生代,然后消失。老年代(OldGeneration)對象沒有變得不可達,并且從新生代中存活下來,會被拷貝到這里。持久代(PermanentGeneration)也被稱為方法區(qū)(methodarea)。他用來保存類常量以及字符串常量。先理解養(yǎng)魚專業(yè)戶的“漁池”?
2023/2/4MetarnetTechnologiesCo.,Ltd.6JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型每個空間的執(zhí)行順序如下:絕大多數(shù)剛剛被創(chuàng)建的對象會存放在伊甸園空間。在伊甸園空間執(zhí)行了第一次GC之后,存活的對象被移動到其中一個幸存者空間。
此后,在伊甸園空間執(zhí)行GC之后,存活的對象會被堆積在同一個幸存者空間。
當(dāng)一個幸存者空間飽和,還在存活的對象會被移動到另一個幸存者空間。之后會清空已經(jīng)飽和的那個幸存者空間。在以上的步驟中重復(fù)幾次依然存活的對象,就會被移動到老年代。2023/2/4MetarnetTechnologiesCo.,Ltd.7JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型垃圾回收(GC)是旨在釋放不可達Java對象所占用的內(nèi)存的過程,是Javavirtualmachine(JVM)中動態(tài)內(nèi)存管理系統(tǒng)的核心組成部分。在一個典型的垃圾回收周期中,所有仍被引用的對象,即可達對象,會被保留。沒有被引用的Java對象所占用的內(nèi)存會被釋放并回收,以便分配給新創(chuàng)建的對象。發(fā)生在新生代的對象的消失:minorGC(局部垃圾回收)發(fā)生在老年代的對象的消失:majorGC(完全垃圾回收)2023/2/4MetarnetTechnologiesCo.,Ltd.8JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)內(nèi)存分配當(dāng)你在啟動Java應(yīng)用程序時指定了啟動參數(shù)_-Xmx_(例如,java-Xmx2gMyApp),則相應(yīng)大小的內(nèi)存會被分配給Java進程。這塊內(nèi)存即所謂的*Java堆*(或簡稱為*堆*)。這塊專用的內(nèi)存地址空間用于存儲Java應(yīng)用程序所創(chuàng)建的對象。隨著Java應(yīng)用程序的運行,會不斷的創(chuàng)建新對象并為之分配內(nèi)存,Java堆(即地址空間)會逐漸被填滿。32位與64位的區(qū)別32位JVM最大堆為1.5G64位JVM最大堆為操作系統(tǒng)中內(nèi)存可使用空間大小2023/2/4MetarnetTechnologiesCo.,Ltd.9JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)垃圾回收minorGCmajorGC目標(biāo)快速釋放不可達對象所占用的內(nèi)存,防止應(yīng)用程序出現(xiàn)OOM錯誤。回收內(nèi)存時,對應(yīng)用程序的性能(指延遲和吞吐量)的影響要盡可能小原則JVM堆不是越大越好(堆越大GC時間越長)不是每個應(yīng)用程序的JVM配置均可以一樣(應(yīng)用規(guī)模、結(jié)構(gòu)和響應(yīng)要求不一樣)調(diào)優(yōu)的操作是循序漸進的(摸著石頭過河)2023/2/4MetarnetTechnologiesCo.,Ltd.10JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具命令行:jstat(關(guān)注GC的次數(shù)和GC所耗時間)jmap(將內(nèi)存堆印象保存為文件)HeapAnalyzer(分析jmap保存的文件)圖形化JconsoleVisualVM2023/2/4MetarnetTechnologiesCo.,Ltd.11JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例jstat–gc$vmid$1000(vmid是java應(yīng)用的進程id號,1000:每隔一秒展示GC監(jiān)控數(shù)據(jù))從上圖中可計算得到以下值:年青代GC發(fā)生了1989次(YGCT),共耗費了41.001秒(YGC),故年青代每次GC的時間為:41.001/1989=0.020秒完全GC發(fā)生了1次(FGCT),共耗費了0.971秒(FGC),故完全GC每次GC的時間為:0.971/1=0.971秒一般性能較好的判斷:年青代GC耗時在50~100毫秒以內(nèi),完全GC小于1秒以內(nèi)為很好的性能。(因為GC均會影響系統(tǒng)訪問)2023/2/4MetarnetTechnologiesCo.,Ltd.12JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例jmap
-dump:format=b,file=testjvm.dump
$vmid$(vmid是java應(yīng)用的進程id號,file:java堆內(nèi)存數(shù)據(jù)保存為文件的名稱)以上的命令可以將當(dāng)前JAVA內(nèi)存堆保存為文件,便于進一步進行分析。特別注意:
進行此工作的時候,應(yīng)用訪問可能會中斷。所以不應(yīng)該在業(yè)務(wù)運行狀態(tài)下操作此命令。2023/2/4MetarnetTechnologiesCo.,Ltd.13JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM分析工具示例HeapAnalyzer命令行:java-Xmx800m-jarha395.jar(注意:-Xmx800m是指定工具所需的java堆大小,此值要大于分析文件的尺寸大小,如果啟動過程中發(fā)現(xiàn)控制臺有java.lang.OutOfMemoryError出現(xiàn),可以適當(dāng)加大上面的數(shù)字800,給予更多的空間。ha395.jar中的文件名稱按實際下載解壓后的文件名為準(zhǔn))2023/2/4MetarnetTechnologiesCo.,Ltd.14JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例
HeapAnalyzer輸出的內(nèi)容:以下表內(nèi)容即顯示當(dāng)前系統(tǒng)中出現(xiàn)泄漏的對象(flex/messaging/messages/AsyncMessage)及占用內(nèi)存的大小。LeakSizeTotalSizeSizeAnalysisNameNo.ChildNo.ParentAddress16199787316199787387Responsiblefor161,997,873bytes(61.14%)ofJavaheapContains2instancesofthefollowingleaksuspects:-arrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0-arrayof[Ljava/lang/Object;holding66,644,382bytesat0x12e5fc68flex/messaging/MessageClient1040xb53e1e866644382666443826972866,644,382bytes(25.15%)ofJavaheapisusedby13,321instancesofflex/messaging/messages/AsyncMessage-Containedunderflex/messaging/MessageClientholding161,997,873bytesat0xb53e1e8arrayof[Ljava/lang/Object;1332110x12e5fc686400692364006923064,006,923bytes(24.16%)ofJavaheapisusedby46,275instancesofbyte[]byte[](61MB/24.2%)000x0613128176131281721661,312,817bytes(23.14%)ofJavaheapisusedby54instancesofflex/messaging/SessionMetricsTrackerContains3instancesofthefollowingleaksuspects:-arrayof[Ljava/lang/Object;holding15,550,384bytesat0x15c5f748-arrayof[Ljava/lang/Object;holding31,137,630bytesat0x179d3ff8-arrayof[Ljava/lang/Object;holding14,608,060bytesat0x167c6918-Containedunderflex/messaging/MessageClientholding161,997,873bytesat0xb53e1e8arrayof[Ljava/lang/Object;5410x1a076af031137630311376303098831,137,630bytes(11.75%)ofJavaheapisusedby6,212instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;621210x179d3ff815550384155503841376815,550,384bytes(5.87%)ofJavaheapisusedby3,108instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;310810x15c5f74814608060146080603098814,608,060bytes(5.51%)ofJavaheapisusedby5,894instancesofflex/messaging/messages/AsyncMessage-Containedunderarrayof[Ljava/lang/Object;holding61,312,817bytesat0x1a076af0arrayof[Ljava/lang/Object;589410x167c69181213937612139376012,139,376bytes(4.58%)ofJavaheapisusedby14,365instancesofint[]int[](11.6MB/4.6%)000x02023/2/4MetarnetTechnologiesCo.,Ltd.15JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例Jconsole命令行:jconsole.exeserver_IP:7080(注意:Server_IP為運行java程序的服務(wù)器IP,7080為專門為jconsole遠(yuǎn)程連接而配置開通的JMX端口。以下為Windows平臺下配置方法:setJAVA_OPTS=%JAVA_OPTS%-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=7080-Dcom.sun.management.jmxremote)2023/2/4MetarnetTechnologiesCo.,Ltd.16JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例visualVMJDK1.6以上版本免費提供,服務(wù)器上相應(yīng)配置與Jconsole連接時一樣(注意:Server_IP為運行java程序的服務(wù)器IP,7080為專門為jconsole遠(yuǎn)程連接而配置開通的JMX端口。提示:如visualVM在JAVA程序本機運行,可以直接運行監(jiān)控到,不需對JMX端口進行設(shè)置)2023/2/4MetarnetTechnologiesCo.,Ltd.17JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.18JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實例JVM監(jiān)控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.19JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實例Jconsole監(jiān)控,HeapDump分析實例
通過以下jconsole監(jiān)控截圖,我們發(fā)現(xiàn)應(yīng)用服務(wù)器的堆內(nèi)存一直在上升。雖然有定時的GC操作(內(nèi)存回收),但整體趨勢仍然是一個斜坡上行的過程。2023/2/4MetarnetTechnologiesCo.,Ltd.20JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實例Jconsole監(jiān)控,HeapDump分析實例
通過以下jconsole監(jiān)控截圖,我們發(fā)現(xiàn)應(yīng)用服務(wù)器的堆內(nèi)存已經(jīng)占用完,年青代和老年代均沒有可進行再分配的空間了,此時執(zhí)行GC也不能成功。當(dāng)前應(yīng)用的狀態(tài)就是無法訪問了。
再通過其GC時間可看到,Copy(即年青代回收)平均每次為1*60/18646=0.0032秒,沒有問題;FullGC為4680秒(1小時18分鐘)/2304=2.03秒。由此可以看出,F(xiàn)ullGC占用了大量時間和次數(shù),但仍然無法將內(nèi)存清理出來。證明內(nèi)存中的某些對象未被成功釋放,需要繼續(xù)分析。2023/2/4MetarnetTechnologiesCo.,Ltd.21JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實例Jconsole監(jiān)控,HeapDump分析實例通過heapdump分析工具,發(fā)現(xiàn)系統(tǒng)中已經(jīng)有非常多的flex/messaging/messages/AsyncMessage實例占用了大部分的內(nèi)存。由此即定位了是哪個實例出現(xiàn)問題,可以聯(lián)系開發(fā)人員進行配合檢查了。2023/2/4MetarnetTechnologiesCo.,Ltd.22JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實例
通過開發(fā)人員分析檢查,確認(rèn)flex的消息對象默認(rèn)沒有設(shè)置其失效時間,建立的對象將永遠(yuǎn)不會失效,故就會造成對象不停的建立,直到內(nèi)存溢出。故修改其配置文件,設(shè)置相關(guān)對象失效時間,達到JAVA可以回收其占用的內(nèi)存空間,如下:<destinationid="chat"><properties><network><subscription-timeout-minutes>30</subscription-timeout-minutes>
</network><server> <message-time-to-live>10000</message-time-to-live> <allow-subtopics>true</allow-subtopics> <subtopic-separator>.</subtopic-separator></server></properties><channels> <channelref="my-polling-amf"/></channels></destination>2023/2/4MetarnetTechnologiesCo.,Ltd.23JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實例JVM參數(shù)介紹以下配置為針對一個特定的應(yīng)用環(huán)境進行的配置:-Xmx4096m最大JAVA堆4G-Xms4096m初始化JAVA堆4G,一般服務(wù)器上均設(shè)置為最大一樣-Xmn1536M年青代堆設(shè)置值1.5G-XX:SurvivorRatio=10年青代中Eden區(qū)與Survivor區(qū)的比例-XX:PermSize=25
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年互聯(lián)網(wǎng)金融服務(wù)質(zhì)押反擔(dān)保合同3篇
- 2024中小學(xué)學(xué)生安全保險及意外傷害處理合同3篇
- 2024年度貸款抵押房屋買賣合同糾紛處理指南3篇
- 2024年度留學(xué)咨詢中介買賣合同3篇
- 2024年度高科技專利權(quán)交叉許可使用合同范本正規(guī)范本3篇
- 2024年度消防設(shè)備質(zhì)量檢測與保證服務(wù)協(xié)議3篇
- 2024年度家具招投標(biāo)買賣合同標(biāo)準(zhǔn)范本3篇
- 新疆師范大學(xué)《數(shù)據(jù)庫原理課程設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 乳房整形病因介紹
- 小學(xué)教育跨國并購失敗案例分析
- 煤炭物流園區(qū)總體規(guī)劃(2016-2030)參考范本
- 一級部門職責(zé)及組織架構(gòu)-總裁辦教學(xué)
- 精品新技術(shù)、新產(chǎn)品、新工藝、新材料的應(yīng)用
- 豎井涌水量方程判定方法
- T∕ACSC 01-2022 輔助生殖醫(yī)學(xué)中心建設(shè)標(biāo)準(zhǔn)(高清最新版)
- 6.2Kendall 相關(guān)性檢驗
- 國家開放大學(xué)《理工英語1》邊學(xué)邊練參考答案
- 國家開放大學(xué)電大??啤豆芾頃嫛菲谀┰囶}及答案
- 內(nèi)蒙古師范大學(xué)論文封面
- (整理)《運籌學(xué)》期末考試試題與參考答案
- (完整版)《金匱要略》方劑總匯(完整版)
評論
0/150
提交評論