詳解JVM 運(yùn)行時(shí)內(nèi)存使用情況監(jiān)控
java 語(yǔ)言, 開(kāi)發(fā)者不能直接控制程序運(yùn)行內(nèi)存, 對(duì)象的創(chuàng)建都是由類(lèi)加載器一步步解析, 執(zhí)行與生成與內(nèi)存區(qū)域中的; 并且jvm有自己的垃圾回收器對(duì)內(nèi)存區(qū)域管理, 回收; 但是我們已經(jīng)可以通過(guò)一些工具來(lái)在程序運(yùn)行時(shí)查看對(duì)應(yīng)的jvm內(nèi)存使用情況, 幫助更好的分析與優(yōu)化我們的代碼;
注: 查看系統(tǒng)里java進(jìn)程信息
// 查看當(dāng)前機(jī)器上所有運(yùn)行的java進(jìn)程名稱與pid(進(jìn)程編號(hào)) jps -l // 顯示指定的jvm進(jìn)程所有的屬性設(shè)置和配置參數(shù) jinfo pid
1 . jmap : 內(nèi)存占用情況查詢 (位于”jdk_home/bin”目錄下)
// 查詢某個(gè)pid進(jìn)程對(duì)應(yīng)的應(yīng)用程序內(nèi)存占用情況 jmap -heap pid // 示例 jmap -heap 5940 Attaching to process ID 5940, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.92-b14 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 734003200 (700.0MB) NewSize = 44040192 (42.0MB) MaxNewSize = 244318208 (233.0MB) OldSize = 88080384 (84.0MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 32505856 (31.0MB) used = 13906760 (13.262519836425781MB) free = 18599096 (17.73748016357422MB) 42.782322052986395% used From Space: capacity = 6291456 (6.0MB) used = 294912 (0.28125MB) free = 5996544 (5.71875MB) 4.6875% used To Space: capacity = 7340032 (7.0MB) used = 0 (0.0MB) free = 7340032 (7.0MB) 0.0% used PS Old Generation capacity = 41943040 (40.0MB) used = 6127536 (5.8436737060546875MB) free = 35815504 (34.15632629394531MB) 14.609184265136719% used 8535 interned Strings occupying 710344 bytes.
2 . jstack : 進(jìn)程所包含線程情況查詢 (位于”jdk_home/bin”目錄下)
// 命令幫助 jstach -h // 顯示進(jìn)程詳情 jstack pid // 示例 jstach 5940 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode): "RMI TCP Connection(10)-10.2.13.162" #32 daemon prio=5 os_prio=0 tid=0x00000000179dc000 nid=0x1f60 in Object.wait() [0x000000001d7dd000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) at com.sun.jmx.remote.internal.ArrayNotificationBuffer.fetchNotifications(ArrayNotificationBuffer.java:449) - locked <0x00000000d462ec18> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer) at com.sun.jmx.remote.internal.ArrayNotificationBuffer$ShareBuffer.fetchNotifications(ArrayNotificationBuffer.java:227) at com.sun.jmx.remote.internal.ServerNotifForwarder.fetchNotifs(ServerNotifForwarder.java:274) at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1270) at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1268) at javax.management.remote.rmi.RMIConnectionImpl.fetchNotifications(RMIConnectionImpl.java:1274) at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324) .............. "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002d10000 nid=0x27dc runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002d11800 nid=0x2d84 runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002d13800 nid=0x118 runnable "VM Periodic Task Thread" os_prio=2 tid=0x0000000015ccb000 nid=0x2fd4 waiting on condition JNI global references: 239
3 . jstat: 可以實(shí)時(shí)監(jiān)測(cè)系統(tǒng)資源占用與jvm運(yùn)行情況 (位于”jdk_home/bin”目錄下)
// 命令語(yǔ)法結(jié)構(gòu): Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] // 參數(shù)解釋?zhuān)? Options — 選項(xiàng),我們一般使用 -gcutil 查看gc情況 vmid — VM的進(jìn)程號(hào),即當(dāng)前運(yùn)行的java進(jìn)程號(hào) interval– 間隔時(shí)間,單位為秒或者毫秒 count — 打印次數(shù),如果缺省則打印無(wú)數(shù)次 S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比 S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比 E — Heap上的 Eden space 區(qū)已使用空間的百分比 O — Heap上的 Old space 區(qū)已使用空間的百分比 P — Perm space 區(qū)已使用空間的百分比 YGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Young GC 的次數(shù) YGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Young GC 所用的時(shí)間(單位秒) FGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Full GC 的次數(shù) FGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full GC 所用的時(shí)間(單位秒) GCT — 從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間(單位秒) //示例 jstat -options -class -compiler -gc -gccapacity -gccause -gcmetacapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcutil -printcompilation jstat -class -t 5940 Timestamp Loaded Bytes Unloaded Bytes Time 6188.4 3898 7178.4 40 58.3 1.78 jstat -gcutil 5940 1000 5 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 25.00 98.55 15.37 96.94 94.88 21 0.069 7 0.237 0.306 0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306 0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306 0.00 25.00 100.00 15.37 96.94 94.88 21 0.069 7 0.237 0.306 0.00 25.00 100.00 15.37 96.94 94.88 21 0.069 7 0.237 0.306
4 . jconsole 以GUI的方式更直觀化呈現(xiàn)jvm進(jìn)程的實(shí)時(shí)情況, 比如內(nèi)存占用, 線程執(zhí)行情況等;
在jdk_home/bin目錄下執(zhí)行 jconsole.exe 打開(kāi)圖形化界面, 然后選擇要檢查的進(jìn)程就可以查看所有相關(guān)jvm情況的信息了.
5 . jprofiler 一個(gè)付費(fèi)的商業(yè)jvm分析監(jiān)控工具, 可查看概況, 內(nèi)存, GC活動(dòng), class 狀況, 線程信息, CPU 占用情況, 內(nèi)存對(duì)象信息, 還有數(shù)據(jù)庫(kù)連接等, 是一個(gè)非常優(yōu)秀的分析工具;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法
這篇文章主要介紹了JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法,涉及java使用FTP實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2015-06-06Java創(chuàng)建二叉搜索樹(shù),實(shí)現(xiàn)搜索,插入,刪除的操作實(shí)例
下面小編就為大家分享一篇Java創(chuàng)建二叉搜索樹(shù),實(shí)現(xiàn)搜索,插入,刪除的操作實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12Hadoop源碼分析四遠(yuǎn)程debug調(diào)試
本篇是Hadoop源碼分析系列文章第四篇,主要介紹一下Hadoop的遠(yuǎn)程debug調(diào)試步驟,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下2021-09-09MyBatis處理mysql主鍵自動(dòng)增長(zhǎng)出現(xiàn)的不連續(xù)問(wèn)題解決
本文主要介紹了MyBatis處理mysql主鍵自動(dòng)增長(zhǎng)出現(xiàn)的不連續(xù)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理
這篇文章主要介紹了Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個(gè)效率最高
這篇文章主要介紹了StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個(gè)效率最高,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Spring在多線程下@Resource注入為null的問(wèn)題
這篇文章主要介紹了Spring在多線程下@Resource注入為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
這篇文章主要介紹了Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼
這篇文章主要介紹了Springboot集成Kafka實(shí)現(xiàn)producer和consumer的示例代碼,詳細(xì)的介紹了什么是Kafka和安裝Kafka以及在springboot項(xiàng)目中集成kafka收發(fā)message,感興趣的小伙伴們可以參考一下2018-05-05