前言
JVM系列前5篇文章相對(duì)偏向于理論加矛,從這篇開(kāi)始將會(huì)結(jié)合實(shí)際場(chǎng)景進(jìn)行分析以及如何對(duì)JVM進(jìn)行調(diào)優(yōu)蚂且。
JVM參數(shù)
所謂的JVM調(diào)優(yōu)說(shuō)白了就是去設(shè)置一個(gè)合理的减细,適合當(dāng)前系統(tǒng)的JVM所提供的參數(shù)流济。從總體上來(lái)說(shuō)JVM參數(shù)可以分為三大類:標(biāo)準(zhǔn)參數(shù)绍弟,-X參數(shù)技即,-XX參數(shù)。
標(biāo)準(zhǔn)參數(shù)
以“-”開(kāi)頭的參數(shù)稱之為標(biāo)準(zhǔn)參數(shù)晌柬,標(biāo)準(zhǔn)參數(shù)是任何一個(gè)JDK版本都支持的參數(shù)姥份,比較穩(wěn)定,一般不會(huì)隨著jdk版本的變化而變化年碘。
比如:
-version
-help
-server
-cp
-X參數(shù)
以-X開(kāi)頭的參數(shù)是在特定版本HotSpot支持的命令澈歉,jdk版本變化之后,參數(shù)可能會(huì)發(fā)生變化屿衅。這個(gè)參數(shù)用的比較少埃难。如以下幾種:
-Xint 解釋執(zhí)行
-Xcomp 第一次使用就編譯成本地代碼
-Xmixed 混合模式,JVM自己來(lái)決定
這種參數(shù)用的比較少涤久,了解就可以了涡尘,在這里不做演示
-XX參數(shù)
-XX是一種不穩(wěn)定的參數(shù),下一個(gè)版本可能會(huì)取消响迂。-XX是JVM調(diào)優(yōu)時(shí)的主要參數(shù)考抄。
-XX參數(shù)分為Boolean型和非Boolean型。
Boolean型
Boolean類型的-XX參數(shù)使用格式為:
-XX:[+-]<name> +或-表示啟用或者禁用name屬性
如:
-XX:+UseConcMarkSweepGC 表示啟用CMS類型的垃圾回收器
-XX:+UseG1GC 表示啟用G1類型的垃圾回收器
-XX:+PrintFlagsFinal 表示打印出所有的JVM參數(shù)信息
打印所有JVM參數(shù)
我們用-XX:+PrintFlagsFinal去打印一下所有的參數(shù)出來(lái)看一下:
任意新建一個(gè)Java類:
package com.zwx.jvm;
public class TestJVMParam {
public static void main(String[] args) {
System.out.println(11);
}
}
本人用的是IntelliJ IDEA工具蔗彤,選擇:Run–>Edit Configurations川梅,然后點(diǎn)擊左邊的+號(hào),選擇Application然遏,出現(xiàn)如下所示界面贫途,加入JVM參數(shù):
然后運(yùn)行main方法,就會(huì)打印出所有參數(shù)(有700多個(gè)):
注意:上圖中打印出來(lái)的參數(shù)中
“=”表示默認(rèn)值待侵,“:=”表示被用戶或JVM修改后的值
非Boolean型
非Boolean類型的-XX參數(shù)的使用格式為:
-XX<name>=<value> name表示屬性丢早,value表示屬性對(duì)應(yīng)的值
如:
-XX:MaxMetaspaceSize=5M 設(shè)置最大永久代空間大小(jdk1.8)
其他參數(shù)
還有其他一些我們非常常用的參數(shù),比如:-Xms秧倾,-Xmx怨酝,-Xss傀缩,但是實(shí)際上這幾種參數(shù)也是屬于-XX參數(shù),這幾種寫(xiě)法不過(guò)就是一種為了方便而設(shè)置的簡(jiǎn)寫(xiě)形式凫碌。所以在上面打印出來(lái)的參數(shù)中搜索-Xms扑毡,-Xmx,-Xss是搜索不到的盛险。
-Xms1000等價(jià)于-XX:InitialHeapSize=1000
-Xmx1000等價(jià)于-XX:MaxHeapSize=1000
-Xss100等價(jià)于-XX:ThreadStackSize=100
常用JVM參數(shù)
參數(shù) | 含義 | 說(shuō)明 |
---|---|---|
-XX:CICompilerCount=3 | 最大并行編譯數(shù) | 大于1時(shí)可以提高編譯速度瞄摊,但會(huì)影響系統(tǒng)穩(wěn)定性,增加JVM崩潰的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 簡(jiǎn)寫(xiě)-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 簡(jiǎn)寫(xiě)-Xmx100M |
-XX:NewSize=20M | 設(shè)置年輕代的大小 | - |
-XX:MaxNewSize=50M | 年輕代最大大小 | - |
-XX:OldSize=50M | 設(shè)置老年代大小 | - |
-XX:MetaspaceSize=50M | 設(shè)置方法區(qū)大小 | jdk1.8中才有苦掘,利用元空間實(shí)現(xiàn)方法區(qū) |
-XX:MaxMetaspaceSize=50M | 方法區(qū)最大大小 | jdk1.8中才有换帜,利用元空間實(shí)現(xiàn)方法區(qū) |
-XX:+UseParNewGC | 設(shè)置ParNe為新生代收集器 | 默認(rèn)會(huì)選擇Serial old作為老年代收集器和其配合 |
-XX:+UseParallelGC | 設(shè)置Parallel Scavenge為新生代收集器,系統(tǒng)默認(rèn)會(huì)選擇Parallel Old為老年代垃圾收集器 | 這個(gè)組合是jdk1.8中默認(rèn)組合鹤啡,吞吐量?jī)?yōu)先的垃圾收集器 |
-XX:+UseParallelOldGC | 設(shè)置Parallel Old為老年代垃圾收集器惯驼,系統(tǒng)默認(rèn)會(huì)選擇Parallel Scavenge為新生代垃圾收集器 | - |
-XX:+ParallelGCThreads | 設(shè)置并行收集垃圾的線程數(shù) | 一般設(shè)置為和cpu個(gè)數(shù)相同,這個(gè)參數(shù)也適用于CMS收集器 |
-XX:+UseConcMarkSweepGC | 選擇CMS為老年代收集器递瑰,同時(shí)系統(tǒng)默認(rèn)會(huì)選擇ParNew為新生代收集器 | 如果CMS收集器出現(xiàn)了Concurrent Mode Failure祟牲,則會(huì)切換到Serial Old為老年代收集器 |
-XX:+CMSScavengeBeforeRemark | CMS收集器在最終標(biāo)記前發(fā)生一次Young GC | - |
-XX:CMSMaxAbortablePrecleanTime | CMS收集器的可中斷預(yù)清理階段最長(zhǎng)停留時(shí)間 | 默認(rèn)是5000,單位是毫秒 |
-XX:+UseG1GC | 使用G1作為收集器 | 同時(shí)適用于新生代和老年代抖部,是一款停頓時(shí)間優(yōu)先的垃圾收集器说贝,jdk1.9中默認(rèn)垃圾收集器 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,則表示新生代:老年代=1:4 |
-XX:SurvivorRatio | 兩個(gè)S區(qū)和Eden區(qū)的比值 | 比如-XX:SurvivorRatio=8慎颗,也就是(S0+S1):Eden=2:8 |
-XX:+HeapDumpOnOutOfMemoryError | 啟動(dòng)堆內(nèi)存溢出打印 | 當(dāng)JVM堆內(nèi)存發(fā)生溢出時(shí)乡恕,也就是OOM,自動(dòng)生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆內(nèi)存溢出打印目錄 | 表示在當(dāng)前目錄生成一個(gè)heap.hprof文件 |
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log | 打印出GC日志 | 不同的垃圾收集器總體格式相同俯萎,但是會(huì)有小差別傲宜,G1相比較其他收集器,差別較大 |
-Xss128k | 設(shè)置每個(gè)線程的堆棧大小 | 經(jīng)驗(yàn)值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 新生代對(duì)象進(jìn)入年老代的最大臨界值 | 默認(rèn)15 |
-XX:InitiatingHeapOccupancyPercent | 啟動(dòng)并發(fā)GC周期時(shí)堆內(nèi)存使用占比 | G1之類的垃圾收集器用它來(lái)觸發(fā)并發(fā)GC周期,基于整個(gè)堆的使用率,而不只是某一代內(nèi)存的使用比. 值為 0 則表示”一直執(zhí)行GC循環(huán)”. 默認(rèn)值為 45 |
-XX:G1HeapWastePercent | 允許的浪費(fèi)堆空間的占比 | 用于G1垃圾收集器夫啊。默認(rèn)是10%函卒,如果并發(fā)標(biāo)記可回收的空間小于10%,則不會(huì)觸發(fā)MixedGC |
-XX:ConcGCThreads=n | 并發(fā)垃圾收集器使用的線程數(shù)量 | 默認(rèn)值隨JVM運(yùn)行的平臺(tái)不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收周期中要包括的舊區(qū)域設(shè)置占用率閾值 | 默認(rèn)占用率為 65% |
-XX:G1MixedGCCountTarget=8 | 設(shè)置標(biāo)記周期完成后,對(duì)存活數(shù)據(jù)上限為G1MixedGCLIveThresholdPercent的舊區(qū)域執(zhí)行混合垃圾回收的目標(biāo)次數(shù) | 默認(rèn)8次混合垃圾回收撇眯,混合回收的目標(biāo)是要控制在此目標(biāo)次數(shù)以內(nèi) |
-XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC時(shí)谆趾,Old Region被加入到CSet中 | 默認(rèn)情況下,G1只把10%的Old Region加入到CSet中 |
常用命令監(jiān)控工具
jdk中的bin目錄下提供了許多功能強(qiáng)大的工具可以幫助我們監(jiān)控虛擬機(jī)的使用情況叛本,掌握了這些常用工具的使用可以幫助我們更快更直觀的分析問(wèn)題。
工具和參數(shù)都是在不斷使用的過(guò)程中掌握的彤钟,并不需要一下子就全部看完来候,可以大致瀏覽有個(gè)印象,
建議大家可以收藏本篇文章逸雹,后續(xù)需要用到的時(shí)候方便查看
以下的演示均是基于linux環(huán)境下jdk1.8版本進(jìn)行演示营搅,不能環(huán)境和版本可能會(huì)有較大差異云挟。
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
復(fù)制代碼
jps
jps:JVM Process Status Tool,一款用于查看java進(jìn)程的工具转质。這款工具的功能非常簡(jiǎn)單园欣,就是查看當(dāng)前環(huán)境下運(yùn)行的java服務(wù)的進(jìn)程id和名稱,一般其他命令使用前都會(huì)先使用jps命令獲取java進(jìn)程信息休蟹。
如下圖所示:
[圖片上傳失敗...(image-e1d4c9-1600758866646)]
<figcaption></figcaption>
jps參數(shù)主要有如下選項(xiàng):
選項(xiàng) | 說(shuō)明 |
---|---|
-q | 只輸出進(jìn)程id |
-m | 輸出虛擬機(jī)啟動(dòng)時(shí)傳遞給main()方法的參數(shù) |
-l | 輸出主類的全名沸枯,如果進(jìn)行執(zhí)行的是jar包,則輸出jar包路徑 |
-v | 輸出啟動(dòng)虛擬機(jī)的參數(shù) |
jstat
jstat:JVM Statistics Monitoring赂弓,一款用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)統(tǒng)計(jì)信息工具绑榴。主要可以顯示如下信息:虛擬機(jī)進(jìn)程的類裝載、內(nèi)存盈魁、垃圾收集翔怎、JIT編譯等運(yùn)行數(shù)據(jù)信息。
查看類裝載信息
jstat -class PID 1000 10 //查看某個(gè)java進(jìn)程的類裝載信息杨耙,每1000毫秒輸出一次赤套,共輸出10次
復(fù)制代碼
查看垃圾收集信息
jstat -gc PID 1000 10
復(fù)制代碼
[圖片上傳失敗...(image-ff9f04-1600758866646)]
上圖中就顯示個(gè)各個(gè)區(qū)以及垃圾回收的情況,具體代表含義如下:
注意:C表示Capacity(容量),U表示Used(已使用大小)
- 1珊膜、S0C容握、S1C表示的是Survive區(qū)的S0和S1大小(Capacity)
- 2、S1U辅搬、S2U表示已使用空間大小(Used)
- 3唯沮、EC、EU分別表示Eden區(qū)總?cè)萘亢鸵咽褂萌萘看笮?/li>
- 4堪遂、OC介蛉、OU分別表示老年代總空間大小和已使用大小
- 5、MC溶褪、MU:表示方法區(qū)(jdk1.8中通過(guò)Metaspace實(shí)現(xiàn))的總空間大小和已使用大小
- 6币旧、CCSC、CCSU:表示壓縮類空間總大小和已使用大小
- 7猿妈、YGC吹菱、YGT:新生代GC次數(shù)和GC總耗時(shí)
- 8、FGC彭则、FGCT:Full GC次數(shù)和Full GC總耗時(shí)
- 9鳍刷、GCT:GC總消耗時(shí)間
如果對(duì)上面含義中涉及到的各種分區(qū)不了解的,可以點(diǎn)擊這里詳細(xì)了解俯抖。
jstat參數(shù)常用選項(xiàng)
參數(shù) | 說(shuō)明 |
---|---|
-class | 查看類加載/卸載數(shù)量和大小输瓜,以及所耗費(fèi)的時(shí)間 |
-gc | 統(tǒng)計(jì)堆內(nèi)各個(gè)分區(qū)的總大小及已使用大小,以及不同分區(qū)的次數(shù)和耗時(shí)等信息 |
-gccapacity | 同-gc相似,但是主要統(tǒng)計(jì)Java堆各個(gè)區(qū)域使用到的最大和最小空間 |
-gcutil | 同-gc類似尤揣,但是主要統(tǒng)計(jì)已使用空間占總空間的大小 |
-gccause | 同-gcutil一樣搔啊,只是會(huì)額外輸出上一次發(fā)生GC原因 |
-gcnew | 統(tǒng)計(jì)新生代的GC情況 |
-gcnewcapacity | 同-gcnew類似,但是主要統(tǒng)計(jì)使用到的最大和最小空間 |
-gcold | 統(tǒng)計(jì)老年代的GC情況 |
-gcoldcapacity | 同-gcold類似北戏,但是主要統(tǒng)計(jì)使用到的最大和最小空間 |
-gcpermcapaticy | 統(tǒng)計(jì)永久代使用到的最大和最小空間 |
-compiler | 輸出JIT編譯器編譯過(guò)得方法和耗時(shí)等信息 |
-printcompilation | 輸出已經(jīng)被JIT編譯的方法 |
jstack
jstack:Stack Trace for Java负芋,一款用于生成當(dāng)前時(shí)刻的線程狀態(tài)信息的快照工具。這個(gè)對(duì)于用來(lái)分析當(dāng)前線程狀態(tài)時(shí)非常有用的嗜愈,比如說(shuō)是否有哪個(gè)線程阻塞了旧蛾,或者說(shuō)是否發(fā)生死鎖等信息。
如:
jstack PID
可以清晰的看到當(dāng)前線程的狀態(tài)芝硬。另外線程的名字也會(huì)打印出來(lái)蚜点,所以在我們自己創(chuàng)建線程的時(shí)候建議是采用自定義的名稱,這樣如果有異常我們可以很容易的知道是哪個(gè)線程出了問(wèn)題拌阴。
jstack參數(shù)常用選項(xiàng)
參數(shù) | 說(shuō)明 |
---|---|
-F | 當(dāng)正常請(qǐng)求不被響應(yīng)時(shí)绍绘,強(qiáng)制輸出線程堆棧 |
-l | 除堆棧外,顯示關(guān)于鎖的附加信息 |
-m | 當(dāng)調(diào)用本地方法時(shí)迟赃,可以顯示C/C++的堆棧 |
jinfo
jinfo:Configuration Info For Java陪拘,一款用于實(shí)時(shí)查看和修改JVM參數(shù)的工具。
注意纤壁,如果是修改的話左刽,只能用我們上面使用命令打印出來(lái)參數(shù)中的manageable類型才可以被修改。
jinfo -flag name PID 查看某個(gè)java進(jìn)程的name屬性的值
jinfo -flags PID 查看已經(jīng)賦值的JVM參數(shù)
針對(duì)Boolean類型的-XX參數(shù)修改命令為:
jinfo -flag [+|-]name PID
針對(duì)非Boolean類型的-XX參數(shù)修改命令為:
jinfo -flag name=value PID
如:
jmap
jmap:Memory Map for Java酌媒,一款用于生成堆轉(zhuǎn)儲(chǔ)快照即dump文件的命令欠痴。
如:
jmap -heap PID //打印出堆內(nèi)存相關(guān)信息
jmap -dump:format=b,file=/usr/heap.hprof PID //生成dump文件
1
但是其實(shí)上面的常用參數(shù)中也有一個(gè)參數(shù)可以設(shè)置,一旦發(fā)生OutOfMemoryError之后就會(huì)自動(dòng)生成dump文件秒咨,這對(duì)我們分析生產(chǎn)環(huán)境發(fā)生OOM的原因是非常重要的喇辽。
如下,我們?cè)賗dea中進(jìn)行設(shè)置自動(dòng)生成dump文件:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
我們利用在JVM系列文章1中所提供的一個(gè)堆內(nèi)存的例子來(lái)進(jìn)行演示一下:
運(yùn)行之后發(fā)生OOM異常雨席,然后可以找到對(duì)應(yīng)目錄下已經(jīng)生成了dump文件菩咨。
既然我們生成了dump文件,肯定是要對(duì)文件進(jìn)行分析的陡厘,但是我們?cè)趺捶治鲞@個(gè)文件呢抽米?因?yàn)橹苯哟蜷_(kāi)時(shí)亂碼的,所以我們肯定需要一款工具來(lái)對(duì)dump文件進(jìn)行分析
jhat
jhat:JVM Heap Analysis Tool糙置,一款用來(lái)分析dump文件的工具云茸。
如:
jhat heap.hprof
然后訪問(wèn)地址:http://localhost:7000/。
可以看到谤饭,這款工具所展示的信息比較簡(jiǎn)單查辩,而且因?yàn)槭敲钚问降呐值眩院茈y直接分析出問(wèn)題,一般情況如果有其他工具可以選擇的話宜岛,并不建議使用這款工具來(lái)分析,接下來(lái)我們就來(lái)看一看可視化工具的使用
可視化監(jiān)控工具
JConsole工具
JConsole:Java Monitoring and Management Console功舀,是一款JDK自帶的可視化監(jiān)控工具萍倡。其實(shí)就是把上面的比如jstat,jstack等命令工具統(tǒng)計(jì)的信息可視化了,主要可以查看java應(yīng)用程序的運(yùn)行概況辟汰、監(jiān)控堆信息列敲、永久區(qū)使用情況、類加載情況等信息帖汞。
JConsole使用方式可以直接在命令行中輸入命令:jconsole戴而,或者直接找到j(luò)dk安裝目錄下找到j(luò)console.exe執(zhí)行文件,雙擊打開(kāi)即可翩蘸。
本地連接的話很簡(jiǎn)單所意,選中一個(gè)服務(wù)雙擊即可,如果是遠(yuǎn)程連接催首,需要遠(yuǎn)程的Java服務(wù)在啟動(dòng)的時(shí)候就配置JMX相關(guān)連接參數(shù)扶踊。
進(jìn)入之后看到如下界面:
可以看到頂部有6個(gè)標(biāo)簽可以切換,在這里就不詳細(xì)去介紹每個(gè)地方有什么用了郎任,自己去嘗試的話其實(shí)是一目了然的秧耗,可以看到內(nèi)存各個(gè)區(qū)間的使用情況,線程信息(線程名字都會(huì)展示)舶治,以及類加載等信息分井。
VisualVM工具
VisualVM:All-in-one Java TroubleshootingTool,是JDK發(fā)布的一款功能最強(qiáng)大的運(yùn)行監(jiān)控故故障處理工具霉猛,正如名字所說(shuō)的All-in-one尺锚,可以預(yù)見(jiàn)這是一款功能非常齊全的工具。
VisualVM主要功能如下:
- 顯示虛擬機(jī)進(jìn)程及進(jìn)程的配置環(huán)境信息(jps韩脏、jinfo功能)缩麸。
- 監(jiān)視應(yīng)用程序的CPU、GC赡矢、堆杭朱、方法區(qū)和線程信息(jstat、jstack功能)吹散。
- dump文件生成及分析(jmap弧械、jhat功能)。
- 方法級(jí)的程序性能分析空民,可以找出被調(diào)用最多刃唐,運(yùn)行時(shí)間最長(zhǎng)的方法羞迷。
- 離線程序快照:收集程序運(yùn)行時(shí)配置、線程dump画饥、內(nèi)存dump等信息建立一個(gè)快照衔瓮,并可以將快照發(fā)送開(kāi)發(fā)者處進(jìn)行Bug反饋
- 插件化處理,可以有無(wú)限擴(kuò)展的可能性
打開(kāi)VisualVM工具的方式可以直接在命令行中輸入命令:jvisualvm抖甘,或者直接找到j(luò)dk安裝目錄下找到j(luò)visualvm.exe執(zhí)行文件热鞍,雙擊打開(kāi)即可。
打開(kāi)之后在左邊選擇自己的本地或者遠(yuǎn)程應(yīng)用(同樣需要遠(yuǎn)程服務(wù)支持JMX服務(wù))之后衔彻,可以看到右邊界面薇宠,注意,默認(rèn)只有前面5個(gè)頁(yè)簽艰额,最后一個(gè)頁(yè)簽是插件加入進(jìn)來(lái)的澄港,不同的插件可以看到不同的功能,我這邊選擇的插件是com-sun-tools-visualvm-modules-visualgc.nbm插件柄沮,這是一個(gè)比較有意思的插件回梧,我們?cè)谥胺治?a target="_blank">Java堆內(nèi)存劃分的一篇文章中提到了一個(gè)對(duì)象的在堆內(nèi)的流轉(zhuǎn)圖,這個(gè)插件打開(kāi)之后可以動(dòng)態(tài)演示堆內(nèi)各個(gè)區(qū)域內(nèi)存變化铡溪,感興趣的可以嘗試下漂辐。
插件使用和下載
點(diǎn)擊主界面工具欄內(nèi):工具–>插件–>已下載–>添加插件,然后安裝即可棕硫,如下圖:
安裝之后重新打開(kāi)就可以看到多了一個(gè)頁(yè)簽髓涯,打開(kāi)之后可以實(shí)時(shí)監(jiān)控內(nèi)存變化
在插件頁(yè)面點(diǎn)擊設(shè)置可以看到最新的插件下載地址(需要vpn才能連接):
分析dump文件
假如生產(chǎn)環(huán)境發(fā)生OutOfMemoryError,我們拿到dump文件之后哈扮,就可以借助VisualVM來(lái)使用纬纪,點(diǎn)擊工具欄中文件–>裝入(注意要選擇文件類型),然后找到對(duì)應(yīng)的dump文件就可以打開(kāi)了
打開(kāi)之后點(diǎn)擊“類”:
可以看到是Integer對(duì)象撐爆了內(nèi)存滑肉,因?yàn)樯厦娴睦邮鞘且粋€(gè)非常簡(jiǎn)單的demo包各,就是不斷地往list中添加了Integer數(shù)據(jù),所以結(jié)合工具可以非常清晰的看到是這個(gè)對(duì)象出了問(wèn)題靶庙,從而定位到問(wèn)題所在问畅。
這個(gè)工具也可以直接dump文件:
這個(gè)工具也可以實(shí)時(shí)設(shè)置自動(dòng)dump文件分析:
總之這是款非常強(qiáng)大的工具,還有其他許多功能六荒,而且插件化工作原理使得其提供了無(wú)限的功能擴(kuò)展护姆,有興趣的可以自己去官網(wǎng)下載不同的插件下來(lái)進(jìn)行試用
其他工具
除了JVM官方提供的工具,還有其他第三方也提供了一些非常優(yōu)秀的工具可以幫助我們更好的分析dump文件掏击,比如說(shuō)阿里巴巴提供的在線實(shí)時(shí)分析工具Arthas卵皂,還有 MAT,Histogram等都是非常優(yōu)秀的工具砚亭。
總結(jié)
本文主要介紹了一些JVM的一些常用參數(shù)的使用灯变,以及JVM提供的一些常用的監(jiān)控工具殴玛,并且利用一個(gè)OOM例子結(jié)合工具來(lái)講述了如何分析OOM時(shí)的dump文件,當(dāng)然添祸,本文的主要目的是告訴大家有哪些工具可以使用滚粟,但是對(duì)一個(gè)工具的使用并沒(méi)有非常詳細(xì)的介紹,大家都是程序員膝捞,相信只要知道了有這么一款工具坦刀,使用的時(shí)候也可以非常容易上手,關(guān)鍵在于實(shí)踐蔬咬,多使用才能積累經(jīng)驗(yàn)。工具畢竟只是工具沐寺,只是可以更好的幫助我們分析問(wèn)題林艘,更重要的是發(fā)現(xiàn)問(wèn)題之后該如何針對(duì)問(wèn)題進(jìn)行修改和優(yōu)化,這才是使用工具的目的混坞。
下一篇狐援,將介紹一下如何分析GC日志,畢竟要想對(duì)JVM調(diào)優(yōu)究孕,GC日志是必須要學(xué)會(huì)進(jìn)行查看分析的啥酱。
請(qǐng)關(guān)注我,和一起學(xué)習(xí)進(jìn)步