1 JVM监控命令
jps、jstack、jmap、jinfo、jstat
1.1 jps
jps主要用来输出JVM中运行的进程状态信息,包括进程ID、进程启动的路径等。
Ps -ef | grep java
1.2 jstack
如果想要查看Java进程中线程堆栈的信息,可以选择jstack。
用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是 定位线程长时间停顿的原因,比如线程间死锁、死循环、请求外部资源导致的长时间等待。
-F:当正常输出的请求不被响应时,强制输出线程堆栈
-l:除堆栈外,显示关于锁的附加信息
-m:如果调用到本地方法的话,可以显示C/C++的堆栈
Jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以在JVM性能调优中使用非常多。
步骤:
1、找出Java进程ID。
ps -ef | grep [服务器上的Java应用名称] | grep -v grep
(grep -v grep是指过滤掉含有grep字符的行)
Eg:ps -ef | grep App
[root@localhost ~]# ps -ef | grep ApacheJetspeed
root 18887 18828 0 08:09 pts/0 00:00:00 grep ApacheJetspeed
字段含义如下:
UID PID PPID C STIME TTY TIME CMD
root 18887 18828 0 08:09 pts/0 00:00:00 grep ApacheJetspeed
ps:将某个进程显示出来
-A 显示所有程序。
-e 此参数的效果和指定"A"参数相同。
-f 显示UID,PPIP,C与STIME栏位。
grep命令是查找
中间的|是管道命令 是指ps命令与grep同时执行
这条命令的意思是显示有关Apachejetspeed有关的进程
各相关信息的意义:
UID 程序被该 UID 所拥有;PID 就是这个程序的 ID ;PPID 则是其上级父程序的ID;C CPU 使用的资源百分比;STIME 系统启动时间;TTY 登入者的终端机位置;TIME 使用掉的 CPU 时间;CMD 所下达的指令为何
2、找出该进程内最耗费CPU的线程。
top -Hp pid
其中,TIME列就是各个Java线程耗费的CPU时间。
3、输出线程的堆栈信息,然后根据线程ID的十六进制值grep。
jstack [线程ID] | grep [线程ID的16进制值]
根据打印信息,就可以判断看到CPU消耗在哪个类的哪个方法上。
遗留问题
Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding。
无法打开套接字文件:目标进程未响应或热点虚拟机未加载。当目标进程没有响应时,可以使用f选项。
加入-F后报错:get_thread_regs failed for a lwp
1.3 jmap
jmap(Memory Map)和 jhat(Java Heap Analysis Tool):jmap导出堆内存,然后使用jhat来进行分析。
1、查看进程堆内存使用情况:包括使用的GC算法、堆配置参数和各代中堆内存使用:
jmap -heap [进程ID]
2、查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象:
jmap -histo[:live] [进程ID]
3、用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。需要注意的是 dump出来的文件还可以用MAT、VisualVM等工具查看。
导出堆:jmap -dump:format=b,file=dumpFileName[文件名] [进程ID]
分析堆文件:jhat /home/weblogic/dumpFileName
查看HTML:http://localhost:7000 远程的话是:http://远程IP:7000]
HTML页面中显示堆中所包含的所有类(All classes excluding platform)、从根集能引用到的对象(Show all members of the rootset)、显示平台包括的所有类的实例数量(Show instance counts for all classes (including platform))、显示平台不包括的所有类的实例数量(Show instance counts for all classes (excluding platform))、堆实例的分布表(Show heap histogram)、Show finalizer summary、执行对象查询语句(Execute Object Query Language (OQL) query)。
1.4 jinfo
主要用于查看指定Java进程(或核心文件、远程调试服务器)的Java配置信息。
1.5 jstat
jstat(JVM统计监测工具): 看看各个区内存和GC的情况。语法格式如下:
jstat -gc 2860[进程ID] 250[采样时间间隔250ms] 6[采样数]
下面输出的是GC信息:
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时
2 JVM可视化监控工具
JConsole、visualVM
2.1 JConsole
JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。
进入JConsole主界面,有”概览”、”内存”、”线程”、”类”、”VM概要”、”MBean”六个页签。
“内存”:相当于jstat命令,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势,还可在详细信息栏观察全部GC执行的时间及次数。
“VM概要”:显示指定的JVM参数及堆信息。
2.2 visualVM
自JDK 6 Update 7以后,提供了一全新的性能检测工具:VisualVM,VisualVM对运行中的Java应用提供了可视化的信息展示, 它是很多工具的整合包,整合了JConsole,jstat,jinfo,jstack以及jmap。
1、简介
VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。
开发大型 Java 应用程序的过程中难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。
2、性能分析的主要方式
监视:监视是一种用来查看应用程序运行时行为的一般方法。通常会有多个视图(View)分别实时地显示 CPU 使用情况、内存使用情况、线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在。
转储:性能分析工具从内存中获得当前状态数据并存储到文件用于静态的性能分析。Java 程序是通过在启动 Java 程序时添加适当的条件参数来触发转储操作的。
系统存储:JVM生成的本地系统的转储,又称为核心转储。一般系统转储数据量大,需要平台相关的工具去分析,如Windows 上的 windbg 和 Linux 上的 gdb。
Java 转储:JVM 内部生成的格式化后的数据,包括线程信息,类的加载信息以及堆的统计数据。通常也用于检测死锁。
堆转储:JVM 将所有对象的堆内容存储到文件。
快照:应用程序启动后,性能分析工具开始收集各种运行时数据,其中一些数据直接显示在监视视图中,而另外大部分数据被保存在内部,直到用户要求获取快照,基于这些保存的数据的统计信息才被显示出来。快照包含了应用程序在一段时间内的执行信息,通常有 CPU 快照和内存快照两种类型。
CPU 快照:主要包含了应用程序中函数的调用关系及运行时间,这些信息通常可以在 CPU 快照视图中进行查看。
内存快照:主要包含了内存的分配和使用情况、载入的所有类、存在的对象信息及对象间的引用关系等。这些信息通常可以在内存快照视图中进行查看。
性能分析:性能分析是通过收集程序运行时的执行数据来帮助开发人员定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率,主要有以下三个方面:
CPU 性能分析:CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。通常有 CPU 监视和 CPU 快照两种方式来显示 CPU 性能分析结果。
内存性能分析:内存性能分析的主要目的是通过统计内存使用情况检测可能存在的内存泄露问题及确定优化内存使用的方向。通常有内存监视和内存快照两种方式来显示内存性能分析结果。
线程性能分析:线程性能分析主要用于在多线程应用程序中确定内存的问题所在。一般包括线程的状态变化情况,死锁情况和某个线程在线程生命期内状态的分布情况等。
2.3 Btrace插件监控应用程序
http://blog.csdn.net/lipc_/article/details/52852968
使用jvisualvm.exe 的Btrace插件监控应用程序。能够线上监控程序状态,获取运行时数据信息,如方法返回值,参数,调用次数,全局变量,调用堆栈等。
1、在jvisualvm.exe安装btrace插件
2、使用插件(Trace application)
3、编辑监控代码,在classpath 中加入 btrace相关的jar包,点击start就可以开始监控了。