JVM內(nèi)存監(jiān)控及調(diào)優(yōu)方法_第1頁(yè)
JVM內(nèi)存監(jiān)控及調(diào)優(yōu)方法_第2頁(yè)
JVM內(nèi)存監(jiān)控及調(diào)優(yōu)方法_第3頁(yè)
JVM內(nèi)存監(jiān)控及調(diào)優(yōu)方法_第4頁(yè)
JVM內(nèi)存監(jiān)控及調(diào)優(yōu)方法_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)

二月23黃國(guó)慶重慶市擎天博元科技有限公司2023/2/4MetarnetTechnologiesCo.,Ltd.2JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)

主要內(nèi)容什么是JVMJVM內(nèi)存模型內(nèi)存分配垃圾回收監(jiān)控實(shí)例配置實(shí)例2023/2/4MetarnetTechnologiesCo.,Ltd.3JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)什么是JVM?基本上來(lái)說(shuō),JVM是一個(gè)虛擬運(yùn)行環(huán)境,對(duì)于字節(jié)碼來(lái)說(shuō)就像是一個(gè)機(jī)器一樣,可以執(zhí)行任務(wù),并通過(guò)底層實(shí)現(xiàn)執(zhí)行內(nèi)存相關(guān)的操作。JVM使Java程序做到了“一次編寫,到處運(yùn)行”。JVM解放了程序員,使程序員不必再關(guān)系對(duì)象的生命周期,使程序員不必再關(guān)心應(yīng)該在何時(shí)釋放內(nèi)存??梢詫VM當(dāng)做是一種專為Java而生的特殊的操作系統(tǒng),它的工作是管理運(yùn)行Java應(yīng)用程序的運(yùn)行時(shí)環(huán)境。2023/2/4MetarnetTechnologiesCo.,Ltd.4JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)什么是OOM?out-of-memory系統(tǒng)無(wú)法為新線程和新對(duì)象分配空間“堆”滿了,垃圾回收不成功影響:業(yè)務(wù)宕機(jī)2023/2/4MetarnetTechnologiesCo.,Ltd.5JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型各個(gè)年代:新生代(YoungGeneration)伊甸園空間(Eden

)、幸存者空間(Survivor

)最新被創(chuàng)建的對(duì)象會(huì)被分配到這里,由于大部分對(duì)象在創(chuàng)建后會(huì)很快變得不可到達(dá),所以很多對(duì)象被創(chuàng)建在新生代,然后消失。老年代(OldGeneration)對(duì)象沒(méi)有變得不可達(dá),并且從新生代中存活下來(lái),會(huì)被拷貝到這里。持久代(PermanentGeneration)也被稱為方法區(qū)(methodarea)。他用來(lái)保存類常量以及字符串常量。先理解養(yǎng)魚專業(yè)戶的“漁池”?

2023/2/4MetarnetTechnologiesCo.,Ltd.6JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型每個(gè)空間的執(zhí)行順序如下:絕大多數(shù)剛剛被創(chuàng)建的對(duì)象會(huì)存放在伊甸園空間。在伊甸園空間執(zhí)行了第一次GC之后,存活的對(duì)象被移動(dòng)到其中一個(gè)幸存者空間。

此后,在伊甸園空間執(zhí)行GC之后,存活的對(duì)象會(huì)被堆積在同一個(gè)幸存者空間。

當(dāng)一個(gè)幸存者空間飽和,還在存活的對(duì)象會(huì)被移動(dòng)到另一個(gè)幸存者空間。之后會(huì)清空已經(jīng)飽和的那個(gè)幸存者空間。在以上的步驟中重復(fù)幾次依然存活的對(duì)象,就會(huì)被移動(dòng)到老年代。2023/2/4MetarnetTechnologiesCo.,Ltd.7JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)JVM內(nèi)存模型垃圾回收(GC)是旨在釋放不可達(dá)Java對(duì)象所占用的內(nèi)存的過(guò)程,是Javavirtualmachine(JVM)中動(dòng)態(tài)內(nèi)存管理系統(tǒng)的核心組成部分。在一個(gè)典型的垃圾回收周期中,所有仍被引用的對(duì)象,即可達(dá)對(duì)象,會(huì)被保留。沒(méi)有被引用的Java對(duì)象所占用的內(nèi)存會(huì)被釋放并回收,以便分配給新創(chuàng)建的對(duì)象。發(fā)生在新生代的對(duì)象的消失:minorGC(局部垃圾回收)發(fā)生在老年代的對(duì)象的消失:majorGC(完全垃圾回收)2023/2/4MetarnetTechnologiesCo.,Ltd.8JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)內(nèi)存分配當(dāng)你在啟動(dòng)Java應(yīng)用程序時(shí)指定了啟動(dòng)參數(shù)_-Xmx_(例如,java-Xmx2gMyApp),則相應(yīng)大小的內(nèi)存會(huì)被分配給Java進(jìn)程。這塊內(nèi)存即所謂的*Java堆*(或簡(jiǎn)稱為*堆*)。這塊專用的內(nèi)存地址空間用于存儲(chǔ)Java應(yīng)用程序所創(chuàng)建的對(duì)象。隨著Java應(yīng)用程序的運(yùn)行,會(huì)不斷的創(chuàng)建新對(duì)象并為之分配內(nèi)存,Java堆(即地址空間)會(huì)逐漸被填滿。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)快速釋放不可達(dá)對(duì)象所占用的內(nèi)存,防止應(yīng)用程序出現(xiàn)OOM錯(cuò)誤。回收內(nèi)存時(shí),對(duì)應(yīng)用程序的性能(指延遲和吞吐量)的影響要盡可能小原則JVM堆不是越大越好(堆越大GC時(shí)間越長(zhǎng))不是每個(gè)應(yīng)用程序的JVM配置均可以一樣(應(yīng)用規(guī)模、結(jié)構(gòu)和響應(yīng)要求不一樣)調(diào)優(yōu)的操作是循序漸進(jìn)的(摸著石頭過(guò)河)2023/2/4MetarnetTechnologiesCo.,Ltd.10JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具命令行:jstat(關(guān)注GC的次數(shù)和GC所耗時(shí)間)jmap(將內(nèi)存堆印象保存為文件)HeapAnalyzer(分析jmap保存的文件)圖形化JconsoleVisualVM2023/2/4MetarnetTechnologiesCo.,Ltd.11JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具示例jstat–gc$vmid$1000(vmid是java應(yīng)用的進(jìn)程id號(hào),1000:每隔一秒展示GC監(jiān)控?cái)?shù)據(jù))從上圖中可計(jì)算得到以下值:年青代GC發(fā)生了1989次(YGCT),共耗費(fèi)了41.001秒(YGC),故年青代每次GC的時(shí)間為:41.001/1989=0.020秒完全GC發(fā)生了1次(FGCT),共耗費(fèi)了0.971秒(FGC),故完全GC每次GC的時(shí)間為:0.971/1=0.971秒一般性能較好的判斷:年青代GC耗時(shí)在50~100毫秒以內(nèi),完全GC小于1秒以內(nèi)為很好的性能。(因?yàn)镚C均會(huì)影響系統(tǒng)訪問(wèn))2023/2/4MetarnetTechnologiesCo.,Ltd.12JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具示例jmap

-dump:format=b,file=testjvm.dump

$vmid$(vmid是java應(yīng)用的進(jìn)程id號(hào),file:java堆內(nèi)存數(shù)據(jù)保存為文件的名稱)以上的命令可以將當(dāng)前JAVA內(nèi)存堆保存為文件,便于進(jìn)一步進(jìn)行分析。特別注意:

進(jìn)行此工作的時(shí)候,應(yīng)用訪問(wèn)可能會(huì)中斷。所以不應(yīng)該在業(yè)務(wù)運(yùn)行狀態(tài)下操作此命令。2023/2/4MetarnetTechnologiesCo.,Ltd.13JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM分析工具示例HeapAnalyzer命令行:java-Xmx800m-jarha395.jar(注意:-Xmx800m是指定工具所需的java堆大小,此值要大于分析文件的尺寸大小,如果啟動(dòng)過(guò)程中發(fā)現(xiàn)控制臺(tái)有java.lang.OutOfMemoryError出現(xiàn),可以適當(dāng)加大上面的數(shù)字800,給予更多的空間。ha395.jar中的文件名稱按實(shí)際下載解壓后的文件名為準(zhǔn))2023/2/4MetarnetTechnologiesCo.,Ltd.14JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具示例

HeapAnalyzer輸出的內(nèi)容:以下表內(nèi)容即顯示當(dāng)前系統(tǒng)中出現(xiàn)泄漏的對(duì)象(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)控實(shí)例JVM監(jiān)控工具示例Jconsole命令行:jconsole.exeserver_IP:7080(注意:Server_IP為運(yùn)行java程序的服務(wù)器IP,7080為專門為jconsole遠(yuǎn)程連接而配置開通的JMX端口。以下為Windows平臺(tái)下配置方法: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)控實(shí)例JVM監(jiān)控工具示例visualVMJDK1.6以上版本免費(fèi)提供,服務(wù)器上相應(yīng)配置與Jconsole連接時(shí)一樣(注意:Server_IP為運(yùn)行java程序的服務(wù)器IP,7080為專門為jconsole遠(yuǎn)程連接而配置開通的JMX端口。提示:如visualVM在JAVA程序本機(jī)運(yùn)行,可以直接運(yùn)行監(jiān)控到,不需對(duì)JMX端口進(jìn)行設(shè)置)2023/2/4MetarnetTechnologiesCo.,Ltd.17JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.18JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)監(jiān)控實(shí)例JVM監(jiān)控工具示例2023/2/4MetarnetTechnologiesCo.,Ltd.19JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實(shí)例Jconsole監(jiān)控,HeapDump分析實(shí)例

通過(guò)以下jconsole監(jiān)控截圖,我們發(fā)現(xiàn)應(yīng)用服務(wù)器的堆內(nèi)存一直在上升。雖然有定時(shí)的GC操作(內(nèi)存回收),但整體趨勢(shì)仍然是一個(gè)斜坡上行的過(guò)程。2023/2/4MetarnetTechnologiesCo.,Ltd.20JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實(shí)例Jconsole監(jiān)控,HeapDump分析實(shí)例

通過(guò)以下jconsole監(jiān)控截圖,我們發(fā)現(xiàn)應(yīng)用服務(wù)器的堆內(nèi)存已經(jīng)占用完,年青代和老年代均沒(méi)有可進(jìn)行再分配的空間了,此時(shí)執(zhí)行GC也不能成功。當(dāng)前應(yīng)用的狀態(tài)就是無(wú)法訪問(wèn)了。

再通過(guò)其GC時(shí)間可看到,Copy(即年青代回收)平均每次為1*60/18646=0.0032秒,沒(méi)有問(wèn)題;FullGC為4680秒(1小時(shí)18分鐘)/2304=2.03秒。由此可以看出,F(xiàn)ullGC占用了大量時(shí)間和次數(shù),但仍然無(wú)法將內(nèi)存清理出來(lái)。證明內(nèi)存中的某些對(duì)象未被成功釋放,需要繼續(xù)分析。2023/2/4MetarnetTechnologiesCo.,Ltd.21JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實(shí)例Jconsole監(jiān)控,HeapDump分析實(shí)例通過(guò)heapdump分析工具,發(fā)現(xiàn)系統(tǒng)中已經(jīng)有非常多的flex/messaging/messages/AsyncMessage實(shí)例占用了大部分的內(nèi)存。由此即定位了是哪個(gè)實(shí)例出現(xiàn)問(wèn)題,可以聯(lián)系開發(fā)人員進(jìn)行配合檢查了。2023/2/4MetarnetTechnologiesCo.,Ltd.22JVM內(nèi)存監(jiān)控及性能調(diào)優(yōu)配置實(shí)例

通過(guò)開發(fā)人員分析檢查,確認(rèn)flex的消息對(duì)象默認(rèn)沒(méi)有設(shè)置其失效時(shí)間,建立的對(duì)象將永遠(yuǎn)不會(huì)失效,故就會(huì)造成對(duì)象不停的建立,直到內(nèi)存溢出。故修改其配置文件,設(shè)置相關(guān)對(duì)象失效時(shí)間,達(dá)到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)配置實(shí)例JVM參數(shù)介紹以下配置為針對(duì)一個(gè)特定的應(yīng)用環(huán)境進(jìn)行的配置:-Xmx4096m最大JAVA堆4G-Xms4096m初始化JAVA堆4G,一般服務(wù)器上均設(shè)置為最大一樣-Xmn1536M年青代堆設(shè)置值1.5G-XX:SurvivorRatio=10年青代中Eden區(qū)與Survivor區(qū)的比例-XX:PermSize=25

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論