国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

javajvm常用命令工具

2019-11-14 15:07:58
字體:
來源:轉載
供稿:網友

【尊重原創文章出自:http://www.chepoo.com/java-jvm-command-tools.html】

一、概述 程序運行中經常會遇到各種問題,定位問題時通常需要綜合各種信息,如系統日志、堆dump文件、線程dump文件、GC日志等。通過虛擬機監控和診斷工具可以幫忙我們快速獲取、分析需要的數據,進而提高問題解決速度。 本文將介紹虛擬機常用監控和問題診斷命令工具的使用方法,主要包含以下工具: jps 顯示系統中所有Hotspot虛擬機進程 jstat 收集Hotspot虛擬機各方面運行數據 jstack 顯示虛擬機的線程棧信息 jinfo 顯示虛擬機的配置信息 jmap 用于生成虛擬機的內存快照信息

以上工具的官方文檔地址: http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/ 圖形化工具如jconsole,jvisualvm將另文介紹。

二、工具介紹 1. jps JVM PRocess Status Tool,該命令用于列出正在運行的虛擬機進程,顯示main類的名稱和虛擬機進程id。該命令受當前用戶的訪問權限影響,比如linux下非root用戶只列出當前用戶啟動的虛擬機進程。

命令格式: jps [options] [hostid]

執行示例:

1234
$ jps -l 3733 sun.tools.jps.Jps 3700 com.leanworld.JVMTools com.leanworld.JVMTools即為上面的示例代碼執行類。

常用參數: -l 輸出主類全名 -v 輸出虛擬機進程啟動的jvm參數 -m 輸出啟動時傳遞給main函數的參數

2. jstat JVM Statistics Monitoring Tool,用于監控各種運行狀態信息的命令。在只有文本控制臺的環境中(如企業中的生產環境),該工具非常有用。 可以用來顯示系統中類裝載、垃圾回收、運行期編譯狀況等運行數據。

命令格式: jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] vmid表示虛擬機唯一標識符,如果是本地虛擬機進程,與LVMID一致,通常為本地虛擬機進程號。 interval表示查詢間隔時間,count表示查詢次數。如果省略interval和count參數,表示查詢一次。

執行示例:

123456
$ jstat -gcutil 3700 500 4   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   50.00   0.00  60.78   0.50  12.76    214    0.049     0    0.000    0.049   0.00  25.00  20.27   0.50  12.76    215    0.049     0    0.000    0.049   0.00  25.00  70.91   0.50  12.76    215    0.049     0    0.000    0.049 50.00   0.00  20.27   0.50  12.76    216    0.049     0    0.000    0.049

S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各參數值表示已使用空間占比。 YGC表示young gc次數,YGCT表示young gc總耗時。FGC表示Full gc次數,FGCT表示full gc總耗時。GCT表示所有gc總耗時時間。

常用參數: class 類裝載相關信息. compiler JIT編譯器編譯過的方法、耗時等. gc java堆信息和垃圾回收狀況. gccapacity 關注java堆各個區的最大和最小空間. gccause 類似gcutil,額外輸出導致上一次gc的原因. gcnew 新生代gc狀況. gcnewcapacity 關注新生代gc使用的最大和最小空間. gcold 老年代gc狀況. gcoldcapacity 關注老年代gc使用的最大和最小空間. gcpermcapacity 關注持久代gc使用的最大和最小空間. gcutil 關注已使用空間占總空間比例. printcompilation 輸出已經被JIT編譯的方法.

3. jstack Stack Trace for Java,用于生成虛擬機當前的線程快照信息,包含每一條線程的堆棧信息。該命令通常用于定位線程停頓原因,當出現線程停頓時,可通過stack查看每個線程的堆棧信息,進而分析停頓原因。 命令格式: jstack [ option ] pid

執行示例:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
$ jstack 3700 2012-01-30 16:36:05 Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode):  "Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000]    java.lang.Thread.State: RUNNABLE  "CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000]    java.lang.Thread.State: RUNNABLE  "Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000]    java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)  "Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000]    java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:485) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked <0xb10e30d0> (a java.lang.ref.Reference$Lock)  "main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000]    java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.leanworld.JVMTools.createList(JVMTools.java:23) at com.leanworld.JVMTools.main(JVMTools.java:29)  "VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable  "GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid=0x135b runnable  "GC task thread#1 (ParallelGC)" prio=10 tid=0x08d85000 nid=0x135c runnable  "GC task thread#2 (ParallelGC)" prio=10 tid=0x08d86400 nid=0x135d runnable  "GC task thread#3 (ParallelGC)" prio=10 tid=0x08d87c00 nid=0x135e runnable  "VM Periodic Task Thread" prio=10 tid=0xaca02c00 nid=0x1367 waiting on condition  JNI global references: 854 通過輸出信息可以看出當前main線程處于TIMED_WAITING狀態,因為執行到示例代碼中Thread.sleep(100);這行的緣故。

常用參數: -l 除堆棧外,顯示鎖的附加信息 -F 當請求不被響應時,強制輸出線程堆棧 -m 混合模式,打印java和本地C++調用的堆棧信息

4. jinfo Configuration Info for Java,用于查看和修改虛擬機的各項參數信息。 命令格式: jinfo [ option ] pid

執行示例:

1234567891011121314151617181920212223242526272829303132
$jinfo 3700 Attaching to process ID 5081, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 Java System Properties:  java.runtime.name = Java(TM) SE Runtime Environment sun.boot.library.path = /home/learnworld/software/jdk1.6.0_21/jre/lib/i386 java.vm.version = 17.0-b16 java.vm.vendor = Sun Microsystems Inc. java.vendor.url = http://java.sun.com/ path.separator = : java.vm.name = Java HotSpot(TM) Server VM file.encoding.pkg = sun.io sun.java.launcher = SUN_STANDARD user.country = CN sun.os.patch.level = unknown java.vm.specification.name = Java Virtual Machine Specification user.dir = /home/learnworld/workspace/concurrency java.runtime.version = 1.6.0_21-b06 java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment java.endorsed.dirs = /home/learnworld/software/jdk1.6.0_21/jre/lib/endorsed os.arch = i386 java.io.tmpdir = /tmp line.separator =  ...  VM Flags: -Xmn10m -Xms40m -Xmx40m -Dfile.encoding=GBK 
-Xbootclasspath:/home/learnworld/software/jdk1.6.0_21/lib/tools.jar
:/home/learnworld/software/jdk1.6.0_21/lib/sa-jdi.jar
:/home/learnworld/software/jdk1.6.0_21/lib/jconsole.jar
:/home/learnworld/software/jdk1.6.0_21/lib/htmlconverter.jar
:/home/learnworld/software/jdk1.6.0_21/lib/dt.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/rt.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/resources.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/plugin.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/management-agent.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/jsse.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/jce.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/javaws.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/deploy.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/charsets.jar
:/home/learnworld/software/jdk1.6.0_21/jre/lib/alt-rt.jar 可以看出,該命令可以方便我們查找需要的虛擬機信息,包含System.getProperties()信息。

常用參數: -flag name 打印虛擬機該參數對應的值. -flag [+/-]name 使該參數生效或失效. -flag name=value 修改相應參數的值. -flags 打印傳給jvm的參數值. -sysprops 打印System.getProperties()信息.

5. jmap Memory Map for Java,可以產生堆dump文件,查詢堆和持久代的詳細信息等。 命令格式: jmap [ option ] pid

執行示例:

123
$ jmap -dump:format=b,file=dump.tmp 3700 Dumping heap to /home/learnworld/dump.tmp ... Heap dump file created

上面這個命令生成了dump.tmp這個dump文件。生成的dump文件可以使用Eclipse Memory Analyzer/jhat等工具進行分析。

1234567891011121314151617181920212223
$ jmap -permstat 3700 Attaching to process ID 3700, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 1355 intern Strings occupying 183024 bytes. finding class loader instances ..Finding object size using Printezis bits and skipping over... done. computing per loader stat ..done. please wait.. computing liveness....done. class_loader	classes	bytes	parent_loader	alive?	type  <bootstrap>	320	1437208	  null  live	<internal> 0xb1170250	10	77120	0xb11706b8	live	sun/misc/Launcher$AppClassLoader@0xad34eb70 0xb11706b8	0	0	  null  live	sun/misc/Launcher$ExtClassLoader@0xad303d40  total = 3	330	1514328	    N/A    alive=3, dead=0	    N/A  常用參數: -dump	生成堆dump文件,格式為: -dump:[live,]format=b,file=<filename>-heap	顯示java堆的詳細信息,包括垃圾回收期、堆配置和分代信息等-histo	顯示堆中對象的統計信息,包括類名稱,對應的實例數量和總容量-permstat	統計持久代中各ClassLoader的統計信息。

三、遇到的問題 我的操作系統Ubuntu10.10,初次使用jinfo和jmap時出現以下錯誤: 引用

12
Attaching to process ID 3538, please wait... Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process

解決方法: 1. echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 該方法在下次重啟前有效。

2. 永久有效方法 sudo vi /etc/sysctl.d/10-ptrace.conf 編輯下面這行: kernel.yama.ptrace_scope = 1 修改為: kernel.yama.ptrace_scope = 0 重啟系統,使修改生效。 該bug詳細信息請參考官方文檔: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7050524


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉林省| 维西| 巴马| 东乡族自治县| 五常市| 朝阳区| 乐业县| 彭水| 雷波县| 韶山市| 宁河县| 公主岭市| 招远市| 永平县| 石景山区| 和平县| 阿拉尔市| 永康市| 界首市| 阳朔县| 仁布县| 波密县| 岳普湖县| 保靖县| 上栗县| 阿图什市| 玉门市| 虞城县| 安西县| 桐梓县| 湛江市| 晋中市| 腾冲县| 兰溪市| 邢台市| 永康市| 建湖县| 革吉县| 岑巩县| 博湖县| 方山县|