国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JVM性能調優監控工具使用詳解

云計算 虛擬化
這些問題在日常開發、維護中可能被很多人忽視(比如有的人遇到上面的問題只是重啟服務器或者調大內存,而不會深究問題根源),但能夠理解并解決這些問題是Java程序員進階的必備要求。

 [[280944]]

現實企業級Java應用開發、維護中,有時候我們會碰到下面這些問題:

  • OutOfMemoryError,內存不足
  • 內存泄露
  • 線程死鎖
  • 鎖爭用(Lock Contention)
  • Java進程消耗CPU過高
  • ......

這些問題在日常開發、維護中可能被很多人忽視(比如有的人遇到上面的問題只是重啟服務器或者調大內存,而不會深究問題根源),但能夠理解并解決這些問題是Java程序員進階的必備要求。本文將對一些常用的JVM性能調優監控工具進行介紹,希望能起拋磚引玉之用。

而且這些監控、調優工具的使用,無論你是運維、開發、測試,都是必須掌握的。

A、 jps(Java Virtual Machine Process Status Tool)

jps主要用來輸出JVM中運行的進程狀態信息。語法格式如下:

  1. jps [options] [hostid] 

如果不指定hostid就默認為當前主機或服務器。

命令行參數選項說明如下:

  1. -q 不輸出類名、Jar名和傳入main方法的參數 
  2. -m 輸出傳入main方法的參數 
  3. -l 輸出main類或Jar的全限名 
  4. -v 輸出傳入JVM的參數 

比如下面:

  1. root@ubuntu:/# jps -m -l 
  2. 2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml 
  3. 29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat 
  4. 3149 org.apache.catalina.startup.Bootstrap start 
  5. 30972 sun.tools.jps.Jps -m -l 
  6. 8247 org.apache.catalina.startup.Bootstrap start 
  7. 25687 com.sun.tools.hat.Main -port 9999 dump.dat 
  8. 21711 mrf-center.jar 

B、jstack

jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式如下:

  1. jstack [option] pid 
  2. jstack [option] executable core 
  3. jstack [option] [server-id@]remote-hostname-or-ip 

命令行參數選項說明如下:

  1. -l long listings,會打印出額外的鎖信息,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況-m mixed mode,不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(比如Native方法) 

jstack可以定位到線程堆棧,根據堆棧信息我們可以定位到具體代碼,所以它在JVM性能調優中使用得非常多。下面我們來一個實例找出某個Java進程中最耗費CPU的Java線程并定位堆棧信息,用到的命令有ps、top、printf、jstack、grep。

第一步先找出Java進程ID,我部署在服務器上的Java應用名稱為mrf-center:

  1. root@ubuntu:/# ps -ef | grep mrf-center | grep -v grep 
  2. root 21711 1 1 14:47 pts/3 00:02:10 java -jar mrf-center.jar 

得到進程ID為21711,第二步找出該進程內最耗費CPU的線程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我這里用第三個,輸出如下:

 

JVM性能調優監控工具使用詳解

 

TIME列就是各個Java線程耗費的CPU時間,CPU時間最長的是線程ID為21742的線程,用

  1. printf "%x\n" 21742 

得到21742的十六進制值為54ee,下面會用到。

OK,下一步終于輪到jstack上場了,它用來輸出進程21711的堆棧信息,然后根據線程ID的十六進制值grep,如下:

  1. root@ubuntu:/# jstack 21711 | grep 54ee 
  2. "PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait [0x00007f94c6eda000] 

可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait,我找了下我的代碼,定位到下面的代碼:

  1. // Idle wait 
  2. getLog.info("Thread [" + getName() + "] is idle waiting..."); 
  3. schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting; 
  4. long now = System.currentTimeMillis; 
  5. long waitTime = now + getIdleWaitTime; 
  6. long timeUntilContinue = waitTime - now; 
  7. synchronized(sigLock) {try { 
  8. if(!halted.get) { 
  9. sigLock.wait(timeUntilContinue); 
  10. } catch (InterruptedException ignore) { 

它是輪詢任務的空閑等待代碼,上面的sigLock.wait(timeUntilContinue)就對應了前面的Object.wait。

C、jmap(Memory Map)和jhat(Java Heap Analysis Tool)

jmap用來查看堆內存使用狀況,一般結合jhat使用。

jmap語法格式如下:

  1. jmap [option] pid 
  2. jmap [option] executable core 
  3. jmap [option] [server-id@]remote-hostname-or-ip 

如果運行在64位JVM上,可能需要指定-J-d64命令選項參數。

  1. jmap -permstat pid 

打印進程的類加載器和類加載器加載的持久代對象信息,輸出:類加載器名稱、對象是否存活(不可靠)、對象地址、父類加載器、已加載的類大小等信息,如下圖:

 

JVM性能調優監控工具使用詳解

 

使用jmap -heap pid查看進程堆內存使用情況,包括使用的GC算法、堆配置參數和各代中堆內存使用情況。比如下面的例子:

  1. root@ubuntu:/# jmap -heap 21711 
  2. Attaching to process ID 21711, please wait... 
  3. Debugger attached successfully. 
  4. Server compiler detected. 
  5. JVM version is 20.10-b01 
  6.  
  7. using thread-local object allocation. 
  8. Parallel GC with 4 thread(s) 
  9.  
  10. Heap Configuration: 
  11. MinHeapFreeRatio = 40 
  12. MaxHeapFreeRatio = 70 
  13. MaxHeapSize = 2067791872 (1972.0MB) 
  14. NewSize = 1310720 (1.25MB) 
  15. MaxNewSize = 17592186044415 MB 
  16. OldSize = 5439488 (5.1875MB) 
  17. NewRatio = 2 
  18. SurvivorRatio = 8 
  19. PermSize = 21757952 (20.75MB) 
  20. MaxPermSize = 85983232 (82.0MB) 
  21.  
  22. Heap Usage: 
  23. PS Young Generation 
  24. Eden Space
  25. capacity = 6422528 (6.125MB) 
  26. used = 5445552 (5.1932830810546875MB) 
  27. free = 976976 (0.9317169189453125MB) 
  28. 84.78829520089286% used 
  29. From Space
  30. capacity = 131072 (0.125MB) 
  31. used = 98304 (0.09375MB) 
  32. free = 32768 (0.03125MB) 
  33. 75.0% used 
  34. To Space
  35. capacity = 131072 (0.125MB) 
  36. used = 0 (0.0MB) 
  37. free = 131072 (0.125MB) 
  38. 0.0% used 
  39. PS Old Generation 
  40. capacity = 35258368 (33.625MB) 
  41. used = 4119544 (3.9287033081054688MB) 
  42. free = 31138824 (29.69629669189453MB) 
  43. 11.683876009235595% used 
  44. PS Perm Generation 
  45. capacity = 52428800 (50.0MB) 
  46. used = 26075168 (24.867218017578125MB) 
  47. free = 26353632 (25.132781982421875MB) 
  48. 49.73443603515625% used 
  49. .... 

使用jmap -histo[:live] pid查看堆內存中的對象數目、大小統計直方圖,如果帶上live則只統計活對象,如下:

  1. root@ubuntu:/# jmap -histo:live 21711 | more  
  2. num #instances #bytes class name---------------------------------------------- 
  3. 1: 38445 5597736 <constMethodKlass> 
  4. 2: 38445 5237288 <methodKlass> 
  5. 3: 3500 3749504 <constantPoolKlass> 
  6. 4: 60858 3242600 <symbolKlass> 
  7. 5: 3500 2715264 <instanceKlassKlass> 
  8. 6: 2796 2131424 <constantPoolCacheKlass> 
  9. 7: 5543 1317400 [I 
  10. 8: 13714 1010768 [C 
  11. 9: 4752 1003344 [B 
  12. 10: 1225 639656 <methodDataKlass> 
  13. 11: 14194 454208 java.lang.String 
  14. 12: 3809 396136 java.lang.Class 
  15. 13: 4979 311952 [S 
  16. 14: 5598 287064 [[I 
  17. 15: 3028 266464 java.lang.reflect.Method 
  18. 16: 280 163520 <objArrayKlassKlass> 
  19. 17: 4355 139360 java.util.HashMap$Entry 
  20. 18: 1869 138568 [Ljava.util.HashMap$Entry; 
  21. 19: 2443 97720 java.util.LinkedHashMap$Entry 
  22. 20: 2072 82880 java.lang.ref.SoftReference 
  23. 21: 1807 71528 [Ljava.lang.Object; 
  24. 22: 2206 70592 java.lang.ref.WeakReference 
  25. 23: 934 52304 java.util.LinkedHashMap 
  26. 24: 871 48776 java.beans.MethodDescriptor 
  27. 25: 1442 46144 java.util.concurrent.ConcurrentHashMap$HashEntry 
  28. 26: 804 38592 java.util.HashMap 
  29. 27: 948 37920 java.util.concurrent.ConcurrentHashMap$Segment 
  30. 28: 1621 35696 [Ljava.lang.Class; 
  31. 29: 1313 34880 [Ljava.lang.String; 
  32. 30: 1396 33504 java.util.LinkedList$Entry 
  33. 31: 462 33264 java.lang.reflect.Field 
  34. 32: 1024 32768 java.util.Hashtable$Entry 
  35. 33: 948 31440 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry; 

class name是對象類型,說明如下:

  1. B byte 
  2. char 
  3. double 
  4. float 
  5. int 
  6. J long 
  7. Z boolean 
  8. [ 數組,如[I表示int[] 
  9. [L+類名 其他對象 

還有一個很常用的情況是:用jmap把進程內存使用情況dump到文件中,再用jhat分析查看。jmap進行dump命令格式如下:

  1. jmap -dump:format=b,file=dumpFileName pid 

我一樣地對上面進程ID為21711進行Dump:

  1. root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 21711  
  2. Dumping heap to /tmp/dump.dat ... 
  3. Heap dump file created 

dump出來的文件可以用MAT、VisualVM等工具查看,這里用jhat查看:

  1. root@ubuntu:/# jhat -port 9998 /tmp/dump.dat 
  2. Reading from /tmp/dump.dat... 
  3. Dump file created Tue Jan 28 17:46:14 CST 2014Snapshot read, resolving... 
  4. Resolving 132207 objects... 
  5. Chasing references, expect 26 dots.......................... 
  6. Eliminating duplicate references.......................... 
  7. Snapshot resolved. 
  8. Started HTTP server on port 9998Server is ready. 

注意如果Dump文件太大,可能需要加上-J-Xmx512m這種參數指定最大堆內存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在瀏覽器中輸入主機地址:9998查看了:

 

JVM性能調優監控工具使用詳解

 

上面紅線框出來的部分大家可以自己去摸索下,最后一項支持OQL(對象查詢語言)。

D、jstat(JVM統計監測工具)

語法格式如下:

  1. jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] 

vmid是Java虛擬機ID,在Linux/Unix系統上一般就是進程ID。interval是采樣時間間隔。count是采樣數目。比如下面輸出的是GC信息,采樣時間間隔為250ms,采樣數為4:

  1. root@ubuntu:/# jstat -gc 21711 250 4  
  2. S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 
  3. 192.0 192.0 64.0 0.0 6144.0 1854.9 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 
  4. 192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 
  5. 192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 
  6. 192.0 192.0 64.0 0.0 6144.0 2109.7 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 

要明白上面各列的意義,先看JVM堆內存布局:

 

JVM性能調優監控工具使用詳解

 

可以看出:

  1. 堆內存 = 年輕代 + 年老代 + 永久代 
  2. 年輕代 = Eden區 + 兩個Survivor區(FromTo

現在來解釋各列含義:

  1. S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used) 
  2. EC、EU:Eden區容量和使用量 
  3. OC、OU:年老代容量和使用量 
  4. PC、PU:永久代容量和使用量 
  5. YGC、YGT:年輕代GC次數和GC耗時 
  6. FGC、FGCT:Full GC次數和Full GC耗時 
  7. GCT:GC總耗時 

E、hprof(Heap/CPU Profiling Tool)

hprof能夠展現CPU使用率,統計堆內存使用情況。

語法格式如下:

  1. java -agentlib:hprof[=options] ToBeProfiledClass 
  2. java -Xrunprof[:options] ToBeProfiledClass 
  3. javac -J-agentlib:hprof[=options] ToBeProfiledClass 

完整的命令選項如下:

  1. Option Name and Value Description Default 
  2. --------------------- ----------- ------- 
  3. heap=dump|sites|all heap profiling all 
  4. cpu=samples|times|old CPU usage off 
  5. monitor=y|n monitor contention n 
  6. format=a|b text(txt) or binary output a 
  7. file=<file> write data to file java.hprof[.txt] 
  8. net=<host>:<port> send data over a socket off 
  9. depth=<size> stack trace depth 4 
  10. interval=<ms> sample interval in ms 10 
  11. cutoff=<value> output cutoff point 0.0001 
  12. lineno=y|n line number in traces? y 
  13. thread=y|n thread in traces? n 
  14. doe=y|n dump on exit? y 
  15. msa=y|n Solaris micro state accounting n 
  16. force=y|n force output to <file> y 
  17. verbose=y|n print messages about dumps y 

來幾個官方指南上的實例。

CPU Usage Sampling Profiling(cpu=samples)的例子:

  1. java -agentlib:hprof=cpu=samples,interval=20,depth=3 Hello 

上面每隔20毫秒采樣CPU消耗信息,堆棧深度為3,生成的profile文件名稱是java.hprof.txt,在當前目錄。

CPU Usage Times Profiling(cpu=times)的例子,它相對于CPU Usage Sampling Profile能夠獲得更加細粒度的CPU消耗信息,能夠細到每個方法調用的開始和結束,它的實現使用了字節碼注入技術(BCI):

  1. javac -J-agentlib:hprof=cpu=times Hello.java 

Heap Allocation Profiling(heap=sites)的例子:

  1. javac -J-agentlib:hprof=heap=sites Hello.java 

Heap Dump(heap=dump)的例子,它比上面的Heap Allocation Profiling能生成更詳細的Heap Dump信息:

  1. javac -J-agentlib:hprof=heap=dump Hello.java 

 

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2017-07-21 08:55:13

TomcatJVM容器

2020-11-09 07:34:49

JVM性能監控

2024-12-04 15:49:29

2017-10-17 14:02:30

jvm調優工具

2023-04-24 14:54:09

JVM性能調優

2012-01-10 14:35:08

JavaJVM

2019-02-19 10:25:28

JVM性能工具

2021-12-06 11:03:57

JVM性能調優

2023-11-11 19:07:23

JVMJava

2023-02-10 09:28:23

優化工具

2010-09-27 10:20:09

JVMLinux

2010-09-26 11:22:22

JVM垃圾回收JVM

2023-11-28 08:43:48

2021-03-17 11:35:11

JVM代碼Java

2010-09-26 13:39:46

JVM調優

2012-01-10 15:13:56

JavaJVM

2010-09-26 09:08:17

JVM調優

2009-04-01 11:17:52

內存分配調優Oracle

2023-03-03 08:14:33

JavaJDK調優

2012-06-20 11:05:47

性能調優攻略
點贊
收藏

51CTO技術棧公眾號

青青青伊人色综合久久| 中国丰满熟妇xxxx性| 6080午夜不卡| 久久精品日产第一区二区三区高清版| 性欧美欧美巨大69| 成人看片网页| 国产大片在线免费观看| 手机在线成人免费视频| 久久艹国产精品| 黄色三级中文字幕| 伊人久久青草| 久久久久久久久久伊人| 国产高清不卡无码视频| 亚洲国产精品女人| 国语精品中文字幕| 国产精品99久久久久久www| 一夜七次郎国产精品亚洲| 欧美日韩一区二区三区四区五区| 综合亚洲深深色噜噜狠狠网站| 日韩黄色视屏| 欧美日韩国产综合草草| 91在线视频免费91| 日韩国产精品大片| 精品国产中文字幕第一页| 三级在线观看视频| 日本美女在线中文版| 精东传媒在线观看| 亚州精品一二三区| 欧美精品卡一卡二| 免费看污久久久| 国产经典一区二区三区| 欧美三电影在线| 久久aⅴ国产紧身牛仔裤| 亚洲人体大胆视频| 亚洲三级国产| 日本天堂在线观看| 日本一卡二卡四卡精品| 国产精品秘入口| 老司机午夜在线视频| 欧美另类老肥妇| 精品一区二区三区亚洲| 美女精品一区最新中文字幕一区二区三区| 校花撩起jk露出白色内裤国产精品| 国产成人三级| 激情综合视频| 欧美亚洲国产视频| 欧美性猛交xxxx乱大交3| 欧洲激情视频| 东凛在线观看| 久久mv成人精品亚洲动漫| 日本一区二区三区四区高清视频| 久久久久久亚洲精品不卡| 色屁屁一区二区| 中文字幕高清不卡| 亚洲成a人v欧美综合天堂下载| 国产精品污网站| 欧美日韩国产电影| 国产一区二区三区在线播放免费观看 | 国语产色综合| 手机在线观看av网站| 性综艺节目av在线播放| 久久成人免费观看| 黄色一级大片免费| 黑人巨大国产9丨视频| 毛片在线播放视频| 亚洲精品国产一区二区精华液| 国产成人一区在线| 亚洲男同gay网站| 精品国产无码在线| 国内精品久久久久影院优| 一区二区三区四区蜜桃| 在线成人直播| 桃色一区二区| 男人艹女人网站| 高清不卡日本v二区在线| 精品视频www| 国产精品久久久久久户外露出| 日韩欧美一区二区三区免费看| www国产在线观看| 黄色av网址在线播放| 97视频免费在线看| 欧美日韩国产综合视频在线观看 | 性开放的欧美大片| 国产日韩av一区二区| 国内精品久久久久久久果冻传媒| 成人av番号网| 国产精品自拍首页| 亚洲人一区二区| 播放灌醉水嫩大学生国内精品| 中文字幕无码不卡免费视频| 黄网视频在线观看| 久久国产精品免费| 国内毛片久久| 亚洲精品承认| 密臀av在线播放| 超碰在线人人爱| 九9re精品视频在线观看re6| 国产亚洲激情视频在线| 亚洲一区二区精品3399| 国产一区亚洲一区| 欧美大奶一区二区| 免费在线看黄色| 色哟哟精品视频| 欧美久久久久久久| 午夜精品偷拍| 精品一二三四区| 国产女同性恋一区二区| 在线观看日产精品| 伊人激情综合网| 91精品久久久久久| 国产老熟妇精品观看| 精品美女视频| 一本免费视频| 亚洲一区不卡在线| 国产精品v片在线观看不卡| 亚洲无限av看| 色国产精品一区在线观看| 成人av在线资源| 91成人免费| 巨胸喷奶水www久久久| 在线视频色在线| 亚洲欧美激情网| 日韩一区二区电影在线观看| 欧美疯狂做受xxxx高潮| 日韩激情av在线免费观看| 亚洲成人一二三| 国产精品传媒在线| 国产二区国产一区在线观看| 亚洲视频久久| 国产精品精品| 国产成人在线中文字幕| 77thz桃花论族在线观看| 99精品老司机免费视频| 久草综合在线观看| 在线一区高清| 日韩片电影在线免费观看| 国产精品一区久久| 欧美巨大黑人极品精男| 精品成人a区在线观看| 青青草娱乐在线| 91福利国产成人精品照片| 性猛交ⅹ×××乱大交| 激情 小说 亚洲 图片: 伦| 亚洲视频免费观看| 久久国产精品99久久人人澡| 欧美电影在线观看免费| 亚洲最大色网站| 国产欧美日韩视频| av男人的天堂在线| 欧美精品观看| 欧美丝袜丝交足nylons| 97影院在线午夜| 精品国产白色丝袜高跟鞋| 日韩视频在线一区二区三区| 91精品啪在线观看国产爱臀| 国产精品国内免费一区二区三区| 成人影院在线看| 在线免费国产| 黄网站免费入口| 国产理论片免费观看| 亚洲福利视频一区二区| 1769国内精品视频在线播放| 一本岛在线视频| 日韩欧美精品综合| 亚洲18色成人| av激情久久| 男人天堂视频在线观看| 免费看日韩精品| 在线观看久久av| eeuss鲁片一区| 一区二区三区毛片免费| 91麻豆精品国产91久久久资源速度 | 黄色片视频在线观看| 牛牛影视一区二区三区免费看| 欧美午夜美女看片| av在线中文| www.美女亚洲精品| 成人爽a毛片一区二区免费| 奇米综合一区二区三区精品视频| 欧洲黄色一级视频| 亚洲免费av网址| 中文字幕欧美日韩| 久久综合88中文色鬼| 欧美精品一区二区三区在线 | 久久精品一二三区| 青春草在线免费视频| 亚洲精品视频自拍| 3d蒂法精品啪啪一区二区免费| 国产精品高清乱码在线观看| 7777精品伊人久久久大香线蕉经典版下载| 国产盗摄女厕一区二区三区| 99综合电影在线视频| 中文字幕精品综合| 亚洲国产日韩综合久久精品| 欧美主播一区二区三区美女| 精品少妇一区二区三区| 在线免费看av不卡| 57pao精品| 国产在线欧美日韩| 成人一区二区av|