jdk命令工具

为什么使用jdk命令工具

当系统需要定位问题的时候,这需要我们使用适当的虚拟机监控和分析工具来帮助我们快速定位问题。

jps工具:虚拟机进程状况工具

  1. 作用:列出正在运行的虚拟机进程,并显示虚拟机执行的主类的名称以及进程的本地虚拟机的唯一ID。
  2. jps命令的格式
    jps 【option】【hostid】
hostid指定了目标的服务器,它的语法如下:
[protocol:][[//]hostname][:port][/servername]
protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议,
如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。
hostname - 服务器的IP或者名称,没有指定则表示本机。
port - 远程rmi的端口,如果没有指定则默认为1099。
Servername - 注册到RMI注册中心中的jstatd的名称。
  1. jps工具参数


    1.jpg
  2. 例子
public class ZkTest {

    public static void main(String[] args) throws Exception {
        Thread.sleep(30000);
        System.out.println("haha");
    }
}
2.jpg

说明:执行ZkTest的这个类的main方法的虚拟机进程ID为5884。


jstat工具:查看虚拟机运行信息

  1. 作用:监视虚拟机各种运行状态信息。可以监视本地以及远程的类装载、内存、垃圾收集、JIT编译等运行数据。如果我们没有使用可视化工具来定位虚拟机性能和故障,可以使用jstat工具。
  2. jstat命令的格式
    jstat [ option vmid [ interval [ s | ms ] [ count ] ] ]
    注意:
    如果我们排查的是本地虚拟机进程,VMID和LVMID是一样的。interval表示查询间隔,count表示查询次数。
    例子:
    如果我们想每200毫秒,一共10次,查看监视类装载、卸载数量、总空间以及类装载所耗费的时间信息。
jstat -class 5884 200 10
  1. jstat命令参数


    3.jpg
  2. 例子:

显示类加载的信息

[root@sunpyServer /]# jstat -class 5733
Loaded  Bytes  Unloaded  Bytes     Time   
  7932 14977.5      136   201.6       7.29

说明:
Loaded:加载class的数量为7932 个。
Bytes:加载所占用的空间大小14977.5字节。
Unloaded:未加载class的数量为136个。
Bytes:未加载占用的空间大小201.6字节。
Time:类装载耗费的时间7.29毫秒。
显示垃圾收集信息

[root@sunpyServer /]# jstat -gcutil 5733
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  20.93  57.12  97.06  92.86    244    1.428    43    4.974    6.403

说明:
S0:Survivor区,表示Survivor0占0.00%。
S1:Survivor区,表示Survivor1占0.00%。
E:新生代Eden区(E,表示Eden)使用了20.93%的空间。
O:老年代(O,表示Old)使用了57.12%。
M:元空间(M,表示Metaspace)使用了97.06%。
CCS:压缩使用比例92.86%。
YGC:Young GC 244次。
YGCT:Young GC总共耗时1.428秒。
FGC:Full GC 43次。
FGCT:Full GC共耗时为4.974秒。
GCT:所有GC总耗时6.403秒。


jmap工具:java内存映像工具

  1. 作用:用于生成堆转储快照、它还可以查询finalize执行队列、java堆和永久代的详细信息(如空间使用率、当前用的哪种收集器)。
  2. jmap命令的格式
jmap 【option】vmid
  1. jmap命令参数


    6.jpg

jstack工具:java堆栈跟踪工具

  1. 作用:生成虚拟机当前时刻的线程快照(threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目得是定位线程出现长时间停顿的原因。譬如:线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
  2. jstack命令格式:
jstack【option】vmid
  1. jstack命令参数:


    7.jpg
  2. 例子
D:\Java\java_123\jdk\bin>jstack 5216
2018-09-09 21:05:26
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):

"Service Thread" daemon prio=6 tid=0x000000000e595800 nid=0xdd4 runnable [0x0000
000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x000000000e593800 nid=0x6a8 waiting on
condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x000000000cdce800 nid=0x1ad4 waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x000000000cdcd800 nid=0x1b74 waiting on co
ndition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x000000000cdc6800 nid=0xf54 runnable [0x
0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x000000000cd57000 nid=0x7c8 in Object.wait() [0x0
00000000e02f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007c1705568> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
        - locked <0x00000007c1705568> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=10 tid=0x000000000cd4e000 nid=0x1084 in Object.w
ait() [0x000000000de6e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007c17050f0> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
        - locked <0x00000007c17050f0> (a java.lang.ref.Reference$Lock)

"main" prio=6 tid=0x000000000212f800 nid=0xf98 waiting on condition [0x000000000
23ff000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at spring_enterprise.ZkTest.main(ZkTest.java:11)

"VM Thread" prio=10 tid=0x000000000cd4a000 nid=0x1728 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x000000000202d800 nid=0x2f0 runnable


"GC task thread#1 (ParallelGC)" prio=6 tid=0x000000000202f800 nid=0x7f0 runnable


"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002031000 nid=0x18cc runnabl
e

"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002033000 nid=0x1a88 runnabl
e

"VM Periodic Task Thread" prio=10 tid=0x000000000e5b0000 nid=0x1880 waiting on c
ondition

JNI global references: 109

说明:从上面的信息可以看出main中waiting on condition情况,该main方法中调用sleep,线程在进行睡眠,在ZkTest的11行代码,并且调用本地方法java.lang.Thread.sleep。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87 1、L...
    唐影若凡阅读 3,727评论 0 11
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,235评论 0 7
  • 我来自山东淄博四十亩地小学二年级二班,我是一个特别爱读书的小男孩,我的另一大喜好就是画画。在参与【班班有读】...
    肖萍_fb74阅读 576评论 0 2
  • 将下面的代码放入index.ios.js 文件中预览就可以看到你想要的了 importReact,{Compone...
    mindasiy阅读 645评论 0 1
  • 慢慢喜 我很快就喜欢你,也好不容易让你慢慢喜欢我。 我向来不太擅长用太欢乐的语气来写关于自己的东西,这也是为什么我...
    霜酱酱阅读 180评论 2 1