jps

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class, main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID。jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。默认端口为1099。(前提是远程服务器提供jstatd服务)。我自己也用PS,即:ps -ef | grep java。
jps命令格式:
jps [-q] [-mlvV] [<hostid>]
options :   
-q            只输出LVMID,省略主类的名称
-m            输出虚拟机京城启动时传递给主类main()函数的参数
-l            输出主类的全名,如果京城执行的是Jar包,输出Jar路径
-v            输出虚拟机进程启动时JVM参数

jstat

用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

jstat命令格式:jstat [option vmid [ interval[s|ms] [count] ] ]

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程ID为2764的垃圾收集状况,一共查询20次,那命令应当是:

jstat –gc 2764 250 20

选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、和运行期编译状况,具体选项及作用请参考描述。
options:
-class                     监视类装载、卸载数量、总空间及类装载耗费的时间
-gc                        监视java堆状况,包括Eden区、2个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gccapacity                监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间
-gcutil                    监视内容与-gc基本内容,但输出主要关注已使用空间占总空间的百分比
-gccause                   与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew                     监视新生代GC的状况
-gcnewcapacity             监视内容与-gcnew 基本相同,输出主要关注使用到的最大和最小空间
-gcold                     监视老年代GC的状况
-gcoldcapacity             监视内容与-gcold基本相同,输出主要关注使用到的最大和最小空间
-gcpermcapaciyt            输出永久带使用到的最大和最小空间
-complier                  输出JIT编译器编译过的方法、耗时等信息
-printcompilation          输出已被JIT编译的方法

jinfo

用于实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显式指定的参数,就只能利用jinfo的-flag选项进行查询了。

jinfo命令格式:
jinfo [option] <pid>
其中option选项可参考一下描述:
-flag 输出指定虚拟机参数,如jinfo -flag MaxHeapSize pid
-sysprops 输出虚拟机进程的System.getProperties()的内容
-flag[+|-] name 修改虚拟机参数值
-flag nam=value 同上

jinfo执行样例:

jinfo -flag MaxHeapSize 3850

jstack

用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈计划。生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack命令格式:
jstack [option]<pid>
执行样例:
jstack 31040 >pidlog/31040.txt

jmap

用于生成堆转储快照。监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;系统崩溃了?jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等。

jmap命令格式:
jmap [option] <pid>
options:
-dump                生成java堆转储快照
-finalizerinfo       显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap                显示java堆详细信息,如使用哪种回收器、参数配置、分代状况等
-histo               显示堆中对象统计信息,包括类、实例数量和合计容量
-permstat            以ClassLoader为统计口径显示永久代内存状态
-F                   当虚拟机进程对-dump选项没有响应时,可使用这个选项生成dump快照

执行样例:

jmap -dump:format=b,file=heap.dump 117815

Memory Analyer

  通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行。不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式“的堆转储文件分析工具,你只需要轻轻点击一下鼠标就可以生成一个专业的分析报告。和其他内存泄露分析工具相比,MAT 的使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用。

  使用步骤:

  1、生成 dump 文件

  2、通过 MAT 打开 dump 出来的内存文件

VisualVM

  VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用、JVM堆内存消耗、线程、类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很有帮助。在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,直接执行jvisualvm.exe即可。VisualVM连接远程服务器有两种方式:JMX和jstatd,两种方式都不能完美支持所有功能,例如JMX不支持VisualGC,jstatd不支持CPU监控,实际使用可同时配置上并按需选用。

  双击启动 Java VisualVM 后可以看到窗口左侧 "应用程序 "栏中有" 本地 "、"远程 " 、"快照 "三个项目。

  "本地 "下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的 统计信息。

  "远程" 项下列出的远程主机上的 Java 程序的资源占用情况,但需要在远程主机上运行 jstatd 守护程序。