jps常用命令javajps # 显示进程的ID 和 类的名称 jps –l # 输出输出完全的包名应用主类名jar的完全路径名 jps –v # 输出jvm参数 jps –q # 显示java进程号 jps -m # main 方法 jps -l xxx.xxx.xx.xx # 远程查看jps参数java-q仅输出VM标识符不包括classname,jar name,arguments in main method -m输出main method的参数 -l输出完全的包名应用主类名jar的完全路径名 -v输出jvm参数 -V输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags所指定的文件 -Joption传递参数到vm,例如:-J-Xms512mjps原理java程序在启动以后会在java.io.tmpdir指定的目录下就是临时文件夹里生成一个类似于hsperfdata_User的文件夹这个文件夹里在Linux中为/tmp/hsperfdata_{userName}/有几个文件名字就是java进程的pid因此列出当前运行的java进程只是把这个目录里的文件名列一下而已。 至于系统的参数什么就可以解析这几个文件获得。更多请参考 jps - Java Virtual Machine Process Status Tooljstackjstack是jdk自带的线程堆栈分析工具使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。线程快照是当前虚拟机内每一条线程上在执行的方法堆栈的集合生成线程快照的主要目的是定位线程出现长时间停顿的原因如线程间死锁、死循环、 请求外部资源导致的长时间等待等问题注意Jstack 可以直接检测死锁Jstack并不能直接检测死循环但可以通过分析线程堆栈信息间接发现死循环的存在例如线程一直处于RUNNABLE状态。CPU 使用率异常高可以通过top或pidstat等工具查看。线程的堆栈信息中会反复出现相同的函数调用。jstack常用命令:java# 基本 jstack pid jstack 2815 # java和native c/c框架的所有栈信息 jstack -m 2815 # 额外的锁信息列表查看是否死锁 jstack -l 2815pid 是需要被打印配置信息的java进程id可以用jps查询jstack参数java-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表. -F 当’jstack [-l] pid’没有相应的时候强制打印栈信息 -m 打印java和native c/c框架的所有栈信息. -h | -help 打印帮助信息Jstack 使用通过使用 jps 命令获取需要监控的进程的pid然后使用 jstack pid 命令查看线程的堆栈信息。通过 jstack 命令可以获取当前进程的所有线程信息。每个线程堆的信息中都可以查看到 线程ID、线程的状态wait、sleep、running 等状态、是否持有锁信息等。死锁示例下面通过一个例子来演示 jstack 检查死锁的一个例子代码如下javapublic static void deathLock() { Thread t1 new Thread() { Override public void run() { try { lock1.lock(); TimeUnit.SECONDS.sleep(1); lock2.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t2 new Thread() { Override public void run() { try { lock2.lock(); TimeUnit.SECONDS.sleep(1); lock1.lock(); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.setName(mythread1); t2.setName(mythread2); t1.start(); t2.start(); }使用 jstack -l pid 查看线程堆栈信息发现在堆栈信息最后面检查出了一个死锁。如下图可以清楚的看出 mythread2 等待 这个锁 “0x00000000d6eb82d0”这个锁是由于mythread1线程持有。mythread1线程等待这个锁“0x00000000d6eb8300”,这个锁是由mythread2线程持有。“mythread1”线程堆栈信息如下可以看出当前线程持有“0x00000000d6eb82d0”锁等待“0x00000000d6eb8300”的锁“mythread2”线程堆栈信息如下“mythread2”的堆栈信息中可以看出当前线程持有“0x00000000d6eb8300”锁等待“0x00000000d6eb82d0”的锁。jinfojinfo 是 JDK 自带的命令可以用来查看正在运行的 java 应用程序的扩展参数包括Java System属性和JVM命令行参数也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息Javacore也可以称为“threaddump”或是“javadump”它是 Java 提供的一种诊断特性能够提供一份可读的当前运行的 JVM 中线程使用情况的快照。即在某个特定时刻JVM 中有哪些线程在运行每个线程执行到哪一个类哪一个方法。应用程序如果出现不可恢复的错误或是内存泄露就会自动触发 Javacore 的生成。jinfo常用命令:java# 输出当前 jvm 进程的全部参数和系统属性 jinfo 2815 # 输出所有的参数 jinfo -flags 2815 # 查看指定的 jvm 参数的值 jinfo -flag PrintGC 2815 # 开启/关闭指定的JVM参数 jinfo -flag PrintGC 2815 # 设置flag的参数 jinfo -flag namevalue 2815 # 输出当前 jvm 进行的全部的系统属性 jinfo -sysprops 2815jinfo参数javano option 输出全部的参数和系统属性 -flag name 输出对应名称的参数 -flag [|-]name 开启或者关闭对应名称的参数 -flag namevalue 设定对应名称的参数 -flags 输出全部的参数 -sysprops 输出系统属性示例一 no option命令jinfo pid描述输出当前 jvm 进程的全部参数和系统属性示例二 -flag name命令jinfo -flag name pid描述输出对应名称的参数使用该命令可以查看指定的 jvm 参数的值。如查看当前 jvm 进程是否开启打印 GC 日志。示例三-flag [|-]name命令jinfo -flag [|-]name pid描述开启或者关闭对应名称的参数使用 jinfo 可以在不重启虚拟机的情况下可以动态的修改 jvm 的参数。尤其在线上的环境特别有用。使用如下示例四-flag namevalue命令jinfo -flag namevalue pid描述修改指定参数的值。同示例三但示例三主要是针对 boolean 值的参数设置的。如果是设置 value值则需要使用 namevalue 的形式。使用如下注意事项 jinfo虽然可以在java程序运行时动态地修改虚拟机参数但并不是所有的参数都支持动态修改示例五 -flags命令jinfo -flags pid描述输出全部的参数示例六-sysprops命令jinfo -sysprops pid描述输出当前 jvm 进行的全部的系统属性jmap命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。两个用途java# 查看堆的对象分配情况 jmap -heap 2815 # dump jmap -dump:live,formatb,file/tmp/heap2.bin 2815 jmap -dump:formatb,file/tmp/heap3.bin 2815 # 查看堆的占用 jmap -histo 2815 | head -10jmap参数javano option 查看进程的内存映像信息,类似 Solaris pmap 命令。 heap 显示Java堆详细信息 histo[:live] 显示堆中对象的统计信息 clstats打印类加载器信息 finalizerinfo 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象 dump:dump-options生成堆转储快照 F 当-dump没有响应时使用-dump或者-histo参数. 在这个模式下,live子参数无效. help打印帮助信息 Jflag指定传递给运行jmap的JVM的参数示例一no option命令jmap pid