ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

常用命令行Java工具规范

2020-04-28 09:53:47  阅读:249  来源: 互联网

标签:Locked java MB sun synchronizers 规范 ownable 常用命令 Java


jinfo

为指定的Java进程生成Java配置信息

jinfo [option] pid

jinfo命令打印指定Java进程的Java配置信息。配置信息包括Java系统属性和JVM命令行参数。如果指定的进程在64位JVM上运行,那么可能需要指定-J-d64选项,例如:

jinfo -J-d64 -sysprops pid

示例

$ jinfo 20016
Attaching to process ID 20016, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
Java System Properties:

java.vendor = Oracle Corporation
...

jstat

监控JVM统计信息

jstat outputOptions [-t] [-h lines] vmid [interval [count]]

选项 -h3 可以指定连续输出的格式中每三个采样就打印一次表头
[interval [count]]: 表示间隔interval ms 连续采样 count 次
-t: 是否显示时间戳

-class 类加载信息

$ jstat -class 113683
Loaded Bytes Unloaded Bytes Time   
 11178 21210.5 17 27.7 8.37

已加载11178个类共21210.5KB,已卸载17个类,共27.7KB,耗时8.37秒

-compiler 编译信息

$ jstat -compiler 113683
Compiled Failed Invalid Time FailedType FailedMethod
    4950 1 0 62.71 1 sun/nio/cs/UTF_8$Decoder decode

Java HotSpot VM JIT 即时编译统计.
Compiled: 执行的编译任务数
Failed: 编译任务失败数
Invalid: 无效的编译任务的数
Time: 执行编译任务花费的时间
FailedType: 上次编译失败的编译类型
FailedMethod: 类名和上次编译失败的方法

-gc 堆GC

jstat -gc 113683
 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT   
34944.0 34944.0 34944.0 0.0 279616.0 30147.7 699072.0 272273.5 83968.0 55348.4 2040122 35503.069 140711 8469.328 43972.397

堆GC统计
S0C: 当前幸存区0容量 (KB).
S1C: 当前幸存区1容量 (KB).
S0U: 幸存区0已用 (KB).
S1U: 幸存区1已用 (KB).
EC: Eden区容量 (KB).
EU: Eden区已用 (KB).
OC: 当前老年代容量 (KB).
OU: 老年代已用 (KB).
MC: Metaspace已提交 (KB).
MU: Metaspace已用 (KB).
CCSC: 压缩类提交大小 (KB).
CCSU: 压缩类使用空间 (KB).
YGC: YoungGC 事件的数量.
YGCT: YoungGC time.
FGC: FullGC 事件的数量.
FGCT: FullGC time.
GCT: 总 GC time.

-gcnew 新生代GC

$ jstat -gcnew 113683 1000
 S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT  
34944.0 34944.0 0.0 34944.0 2 6 17472.0 279616.0 109889.6 2040171 35503.861
34944.0 34944.0 0.0 34944.0 2 6 17472.0 279616.0 144828.6 2040171 35503.861
34944.0 34944.0 34944.0 0.0 2 6 17472.0 279616.0 88319.9 2040172 35503.878

新生代统计.
S0C: 当前幸存区0容量 (KB).
S1C: 当前幸存区1容量 (KB).
S0U: 幸存区0已用 (KB).
S1U: 幸存区1已用 (KB).
TT: 任期阈值 Tenuring threshold.
MTT: 最大任期阈值 Maximum tenuring threshold.
DSS: 期望幸存区大小 Desired survivor size (KB).
EC: Current eden space capacity (KB).
EU: Eden space utilization (KB).
YGC: YoungGC 事件的数量.
YGCT: YoungGC time.

-gcutil 分代内存使用率

每隔1000ms采样共3次

$ jstat -gcutil 113683 1000 3
  S0 S1 E O P YGC YGCT FGC FGCT GCT   
  0.00 93.85 13.85 42.54 65.92 2040457 35508.340 140731 8470.428 43978.768
  0.00 93.85 14.80 42.54 65.92 2040457 35508.340 140731 8470.428 43978.768
  0.00 93.85 25.26 42.54 65.92 2040457 35508.340 140731 8470.428 43978.768

垃圾收集统计信息的汇总.
S0: 幸存区0使用率.
S1: 幸存区1使用率.
E: Eden区使用率.
O: Old区使用率.
M: Metaspace使用率.
CCS: 压缩类空间使用率.
YGC: YoungGC次数.
YGCT: YoungGC耗时.
FGC: FullGC次数.
FGCT: FullGC耗时.
GCT: 总GC耗时.

下面这个示例: 对 21891 的进程每隔250ms统计共7次,输出格式为-gcutil
输出显示在第三个和第四个采样之间发生了年轻代收集。收集时间为0.078秒,将对象从eden空间(E)提升到旧空间(O),导致旧空间利用率从66.80%提高到68.19%。收集前,幸存者空间的利用率为97.02%,收集后,幸存者空间的利用率为91.03%。

jstat -gcutil 21891 250 7
  S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
  0.00 97.02 70.31 66.80 95.52 89.14 7 0.300 0 0.000 0.300
  0.00 97.02 86.23 66.80 95.52 89.14 7 0.300 0 0.000 0.300
  0.00 97.02 96.53 66.80 95.52 89.14 7 0.300 0 0.000 0.300
 91.03 0.00 1.98 68.19 95.89 91.24 8 0.378 0 0.000 0.378
 91.03 0.00 15.82 68.19 95.89 91.24 8 0.378 0 0.000 0.378
 91.03 0.00 17.80 68.19 95.89 91.24 8 0.378 0 0.000 0.378
 91.03 0.00 17.80 68.19 95.89 91.24 8 0.378 0 0.000 0.378

jstatd

jstatd [options]

jstatd命令是一个RMI服务器应用程序,它监视仪表化的Java HotSpot vm的创建和终止,并提供一个接口来支持远程监控工具(jstat和jps)附加到本地主机上运行的JVM上,并收集关于JVM进程的信息。
jstatd服务器需要本地主机上的RMI注册表。jstatd服务器尝试在默认端口上,或者在使用-p端口选项指定的端口上附加到RMI注册表。如果没有找到RMI注册表,则在jstatd应用程序中创建一个,该应用程序绑定到-p端口选项所指示的端口,或者在-p端口选项被省略时绑定到默认的RMI注册端口。您可以通过指定-nr选项来停止内部RMI注册表的创建。

命令选项

  • -nr: 当没有找到现有的RMI注册中心时,该选项不会试图在jstatd进程中创建一个内部的RMI注册中心。
  • -p port: 此选项设置RMI注册中心所在的端口号,如果没有指定-nr选项,则在未找到注册中心或未找到注册中心时创建该端口号。
  • -n rminame: 此选项设置远程RMI对象在RMI注册表中绑定到的名称。默认名称是JStatRemoteHost。如果在同一台主机上启动多个jstatd服务器,则可以通过指定此选项使每个服务器导出的RMI对象的名称变得惟一。但是,这样做需要在监控客户端的hostid和vmid字符串中包含唯一的服务器名。
  • -Joption: 此选项将Java选项传递给JVM,其中该选项是Java应用程序启动程序参考页面中描述的选项之一。例如,-J-Xms48m将启动内存设置为48mb。

安全性

jstat没有安全访问策略,一旦开启会默认导出所有JVM工具.因此需要使用本地安全策略来限制.
all.policy

grant codebase "file:${java.home}/../lib/tools.jar" {   
    permission java.security.AllPermission;
};

开启远程监控支持

jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

远程客户端连接

 jstat -gcutil 20016@localhost 1000

远程地址协议格式

[protocol:][//]lvmid[@hostname[:port][/servername]

jstack

为指定的Java进程打印Java线程的Java堆栈跟踪

jstack [options] pid

输出Java线程栈信息

2020-04-27 16:39:17
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode):

"Swing-Shell" #40 daemon prio=6 os_prio=0 tid=0x000000001c030800 nid=0x57c4 waiting on condition [0x000000002078e000]
   java.lang.Thread.State: WAITING (parking)
 at sun.misc.Unsafe.park(Native Method)
 - parking to wait for <0x00000000f0563d08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:547)
 at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
 - None

"Timer-0" #36 daemon prio=1 os_prio=-2 tid=0x000000001c032000 nid=0x1b8c in Object.wait() [0x000000002008e000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 at java.util.TimerThread.mainLoop(Timer.java:552)
 - locked <0x00000000f09b6610> (a java.util.TaskQueue)
 at java.util.TimerThread.run(Timer.java:505)

   Locked ownable synchronizers:
 - None

...

"VM Thread" os_prio=2 tid=0x0000000015467000 nid=0x29ac runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000004948000 nid=0x48c runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000004949800 nid=0x6730 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000494b000 nid=0x8380 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000494c800 nid=0x1104 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x0000000018135000 nid=0x1e54 waiting on condition 

JNI global references: 3149

输出Java线程栈和本地线程栈(mixed mode)

$ jstack -l -m 20016
Attaching to process ID 20016, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
Deadlock Detection:

No deadlocks found.

----------------- 0 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
0xec8b485741564155 ????????
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: ReadVirtual failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess(WindbgDebuggerLocal.java:490)
        at sun.jvm.hotspot.debugger.DebuggerBase$Fetcher.fetchPage(DebuggerBase.java:80)
        at sun.jvm.hotspot.debugger.PageCache.getPage(PageCache.java:178)
        at sun.jvm.hotspot.debugger.PageCache.getLong(PageCache.java:100)
        at sun.jvm.hotspot.debugger.DebuggerBase.readCInteger(DebuggerBase.java:364)
        at sun.jvm.hotspot.debugger.DebuggerBase.readAddressValue(DebuggerBase.java:462)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readAddress(WindbgDebuggerLocal.java:316)
        at sun.jvm.hotspot.debugger.windbg.WindbgAddress.getAddressAt(WindbgAddress.java:72)
        at sun.jvm.hotspot.debugger.windows.amd64.WindowsAMD64CFrame.sender(WindowsAMD64CFrame.java:60)
        at sun.jvm.hotspot.tools.PStack.run(PStack.java:161)
        at sun.jvm.hotspot.tools.PStack.run(PStack.java:58)
        at sun.jvm.hotspot.tools.PStack.run(PStack.java:53)
        at sun.jvm.hotspot.tools.JStack.run(JStack.java:66)
        at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
        at sun.tools.jstack.JStack.main(JStack.java:106)
----------------- 1 -----------------
----------------- 2 -----------------
Locked ownable synchronizers:
    - None
----------------- 3 -----------------
----------------- 4 -----------------
----------------- 5 -----------------
----------------- 6 -----------------
----------------- 7 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
----------------- 8 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 9 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 10 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 11 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
0x7564646165726874 ????????
Locked ownable synchronizers:
    - None
----------------- 12 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 13 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 14 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 15 -----------------
Locked ownable synchronizers:
    - None
----------------- 16 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
----------------- 17 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 18 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 19 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 20 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 21 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 22 -----------------
Locked ownable synchronizers:
    - None
----------------- 23 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 24 -----------------
----------------- 25 -----------------
0x00007ffaa8a70c04 ntdll!NtWaitForMultipleObjects + 0x14
----------------- 26 -----------------
0x00007ffaa8a701d4 ntdll!NtRemoveIoCompletion + 0x14
0x0000000004a3835d * sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus(long) bci:11 line:1007 (Interpreted frame)
0x0000000004a380e0 * sun.nio.fs.WindowsWatchService$Poller.run() bci:4 line:571 (Interpreted frame)
0x0000000004a383a2 * java.lang.Thread.run() bci:11 line:745 (Interpreted frame)
0x0000000004a308da <StubRoutines>
0x00000000659c4b43 jvm!JVM_GetThreadStateNames + 0x76b63
Locked ownable synchronizers:
    - None
----------------- 27 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 28 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - <0x00000000f09b60d0>, (a java/util/concurrent/locks/ReentrantLock$NonfairSync)
----------------- 29 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 30 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 31 -----------------
0x00007ffaa8a70134 ntdll!NtWaitForSingleObject + 0x14
Locked ownable synchronizers:
    - None
----------------- 32 -----------------

jmap

打印指定进程的详细信息

jmap [options] pid

输出JVM堆内存统计信息

$ jmap -heap 113683
Attaching to process ID 113683, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize = 1073741824 (1024.0MB)
   NewSize = 1310720 (1.25MB)
   MaxNewSize = 357892096 (341.3125MB)
   OldSize = 5439488 (5.1875MB)
   NewRatio = 2
   SurvivorRatio = 8
   PermSize = 21757952 (20.75MB)
   MaxPermSize = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 322109440 (307.1875MB)
   used = 201960016 (192.6040802001953MB)
   free = 120149424 (114.58341979980469MB)
   62.699191926818415% used
Eden Space:
   capacity = 286326784 (273.0625MB)
   used = 181825072 (173.4019012451172MB)
   free = 104501712 (99.66059875488281MB)
   63.50264179267281% used
From Space:
   capacity = 35782656 (34.125MB)
   used = 20134944 (19.202178955078125MB)
   free = 15647712 (14.922821044921875MB)
   56.270121480082416% used
To Space:
   capacity = 35782656 (34.125MB)
   used = 0 (0.0MB)
   free = 35782656 (34.125MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 715849728 (682.6875MB)
   used = 185285824 (176.70233154296875MB)
   free = 530563904 (505.98516845703125MB)
   25.883340700242606% used
Perm Generation:
   capacity = 85983232 (82.0MB)
   used = 56676752 (54.05116271972656MB)
   free = 29306480 (27.948837280273438MB)
   65.91605209722752% used

31342 interned Strings occupying 2565488 bytes.

输出二进制的堆转储文件

$ jmap -dump:live,format=b,file=/c/tmp/test.dump 20016
Dumping heap to C:\tmp\test.dump ...
Heap dump file created

注意: live选项输出活动对象,这个会触发Full GC

  • 输出对象占用字节数的统计信息,从大到小排序,快速查看内存对象,也可以通过堆转储文件分析
$ jmap -histo 20016

 num #instances #bytes class name
----------------------------------------------
   1: 270066 19793280 [C
   2: 654 19619096 [J
   3: 10277 8041896 [I
   4: 266322 6391728 java.lang.String
   5: 75117 3527176 [Ljava.lang.Object;
   6: 62928 3523968 org.netbeans.lib.profiler.heap.ClassDump
...
  • 输出等待finalization的对象信息
$ jmap -finalizerinfo 20016
Attaching to process ID 20016, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
Number of objects pending for finalization: 0

输出类加载器统计信息

$ jmap -clstats 20016
Attaching to process ID 20016, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type

<bootstrap> 4202 7737541 null live <internal>
0x00000000f0247b20 87 281012 0x00000000f03f52d0 dead org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001600e8
0x00000000f061a568 1 880 0x00000000f03f52d0 dead sun/reflect/DelegatingClassLoader@0x0000000100009df8
...
0x00000000f02768d8 60 127558 0x00000000f03f52d0 dead org/netbeans/StandardModule$OneModuleClassLoader@0x00000001001600e8

total = 123 11602 26375043 N/A alive=1, dead=122 N/A

引用

标签:Locked,java,MB,sun,synchronizers,规范,ownable,常用命令,Java
来源: https://www.cnblogs.com/onion94/p/common-java-tool-specifications-jstack-jstat.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有