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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JVM內存監(jiān)控及性能調優(yōu)

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

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

)、幸存者空間(Survivor

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

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

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

當一個幸存者空間飽和,還在存活的對象會被移動到另一個幸存者空間。之后會清空已經(jīng)飽和的那個幸存者空間。在以上的步驟中重復幾次依然存活的對象,就會被移動到老年代。2023/2/4MetarnetTechnologiesCo.,Ltd.7JVM內存監(jiān)控及性能調優(yōu)JVM內存模型垃圾回收(GC)是旨在釋放不可達Java對象所占用的內存的過程,是Javavirtualmachine(JVM)中動態(tài)內存管理系統(tǒng)的核心組成部分。在一個典型的垃圾回收周期中,所有仍被引用的對象,即可達對象,會被保留。沒有被引用的Java對象所占用的內存會被釋放并回收,以便分配給新創(chuàng)建的對象。發(fā)生在新生代的對象的消失:minorGC(局部垃圾回收)發(fā)生在老年代的對象的消失:majorGC(完全垃圾回收)2023/2/4MetarnetTechnologiesCo.,Ltd.8JVM內存監(jiān)控及性能調優(yōu)內存分配當你在啟動Java應用程序時指定了啟動參數(shù)_-Xmx_(例如,java-Xmx2gMyApp),則相應大小的內存會被分配給Java進程。這塊內存即所謂的*Java堆*(或簡稱為*堆*)。這塊專用的內存地址空間用于存儲Java應用程序所創(chuàng)建的對象。隨著Java應用程序的運行,會不斷的創(chuàng)建新對象并為之分配內存,Java堆(即地址空間)會逐漸被填滿。32位與64位的區(qū)別32位JVM最大堆為1.5G64位JVM最大堆為操作系統(tǒng)中內存可使用空間大小2023/2/4MetarnetTechnologiesCo.,Ltd.9JVM內存監(jiān)控及性能調優(yōu)垃圾回收minorGCmajorGC目標快速釋放不可達對象所占用的內存,防止應用程序出現(xiàn)OOM錯誤?;厥諆却鏁r,對應用程序的性能(指延遲和吞吐量)的影響要盡可能小原則JVM堆不是越大越好(堆越大GC時間越長)不是每個應用程序的JVM配置均可以一樣(應用規(guī)模、結構和響應要求不一樣)調優(yōu)的操作是循序漸進的(摸著石頭過河)2023/2/4MetarnetTechnologiesCo.,Ltd.10JVM內存監(jiān)控及性能調優(yōu)監(jiān)控實例JVM監(jiān)控工具命令行:jstat(關注GC的次數(shù)和GC所耗時間)jmap(將內存堆印象保存為文件)HeapAnalyzer(分析jmap保存的文件)圖形化JconsoleVisualVM2023/2/4MetarnetTechnologiesCo.,Ltd.11JVM內存監(jiān)控及性能調優(yōu)監(jiān)控實例JVM監(jiān)控工具示例jstat–gc$vmid$1000(vmid是java應用的進程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毫秒以內,完全GC小于1秒以內為很好的性能。(因為GC均會影響系統(tǒng)訪問)2023/2/4MetarnetTechnologiesCo.,Ltd.12JVM內存監(jiān)控及性能調優(yōu)監(jiān)控實例JVM監(jiān)控工具示例jmap

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

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

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

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

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

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

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

通過開發(fā)人員分析檢查,確認flex的消息對象默認沒有設置其失效時間,建立的對象將永遠不會失效,故就會造成對象不停的建立,直到內存溢出。故修改其配置文件,設置相關對象失效時間,達到JAVA可以回收其占用的內存空間,如下:<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內存監(jiān)控及性能調優(yōu)配置實例JVM參數(shù)介紹以下配置為針對一個特定的應用環(huán)境進行的配置:-Xmx4096m最大JAVA堆4G-Xms4096m初始化JAVA堆4G,一般服務器上均設置為最大一樣-Xmn1536M年青代堆設置值1.5G-XX:SurvivorRatio=10年青代中Eden區(qū)與Survivor區(qū)的比例-XX:PermSize=25

溫馨提示

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

評論

0/150

提交評論