首先在云服务器上安装工具:
1、查看有哪些可以安装的工具
yum list --showduplicate | grep java-1.8 | grep devel
2、选择一个进行安装
yum install java-1.8.0-openjdk-devel.x86_64 -y
安装完成以后就可以使用了
一、命令行工具
1、jps (Jvm process status tool) :显示指定系统内所有的HotSpot虚拟机进程
命令格式:
jps [options][hostid]
例如:
jps -l
选项和作用:
-q: 只输出LVMID,省略主类名称
-m: 输出虚拟机进程启动时传递给主类main()函数的参数
-l: 输出主类全名,如果执行的时jar包,会输出jar路径
-v:输出虚拟机启动时JVM参数
2、jstat (Jvm static Monitoring Tool):用于收集HotSpot虚拟机各方面的运行数据
可以显示本地或者远程虚拟机中类装载、内存、垃圾收集、JIT编译等运行数据,是运行期定位虚拟机性能问题的首选工具
命令格式:
jstat [option vmid [interval[s|ms][count]]]
interval 和count代表查询间隔和次数
每250毫秒查询一次进程2764垃圾收集状况,查询20次:
jstat -gc 2764 250 20
选项和作用:
-class 类加载的信息
-gc 堆状况,GC时间等信息
-gcutil 关注于已使用空间比例
-gccause 与gcuti类试但是会输出上一次Gc的原因
-gcnew 监视新生代gc信息
-gcnewcapacity 与gcnew类试,关注使用到的最大最小空间
-gcold 监视老年代gc信息
-gcoldcapacity
-gcpermcapacity 输出永久代使用动的最大、最小空间
-compiler 输出jit编译器编译过的方法、耗时
-printcompilation 输出已经被JIt编译的方法
示例:
jstat -gcutil 2764
上面的参数什么意思:
S0C:年轻代中第一个survivor(幸存区)的容量 (kb)
S1C:年轻代中第二个survivor(幸存区)的容量 (kb)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (kb)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (kb)
EC:年轻代中Eden(伊甸园)的容量 (kb)
EU:年轻代中Eden(伊甸园)目前已使用空间 (kb)
OC:Old代的容量 (kb)
OU:Old代目前已使用空间 (kb)
PC:Perm(持久代)的容量 (kb)
PU:Perm(持久代)目前已使用空间 (kb)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (kb)
NGCMX:年轻代(young)的最大容量 (kb)
NGC:年轻代(young)中当前的容量 (kb)
OGCMN:old代中初始化(最小)的大小 (kb)
OGCMX:old代的最大容量 (kb)
OGC:old代当前新生成的容量 (kb)
PGCMN:perm代中初始化(最小)的大小 (kb)
PGCMX:perm代的最大容量 (kb)
PGC:perm代当前新生成的容量 (kb)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (kb)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (kb)
ECMX:年轻代中Eden(伊甸园)的最大容量 (kb)
DSS:当前需要survivor(幸存区)的容量 (kb)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
3、jinfo(Configuration Info for Java):显示虚拟机配置信息
选项和作用
-v 查看虚拟机启动时指定的参数列表
-flag 查看未被显示指定的默认参数(java -XX:+PrintFlagsFinal 查看参数默认值也可以)
-syspropsn把虚拟机进程的System.getProperties()的内容打印出来
-flag [+/-] name或者 -flag name=value 修改一部分运行期可写的虚拟机参数值。
示例:
查询 CMSInitiatingOccupancyFraction参数值:
jinfo -flag CMSInitiatingOccupancyFraction 144
4、jmap(Memory Map for Java):生成虚拟机内存转存储快照(heapdump 文件)内存映射工具
还可以设置参数:
-XX:+HeapDumpPnOutOfMemoryError参数 可以让虚拟在发生OOM后生成dump文件
-XX:+HeadDumpOnCtrlBreak参数可使用Ctrl+Break键生成dump文件
或者Linux系统中通过Kill -3命令,也能拿到Dump文件
该工具还能查看finalize执行队列,java堆和永久代详细信息,垃圾收集器等
命令格式jmap [option] vmid
选项
生成heapdump文件
jmap -dump:live,format=b,file=dump.hprof 1155
jmap -finalizerinfo 1819
jmap -heap 1819。 堆配置和使用情况
5、jhat(Jvm heap dump browser):用于分析heapdump文件,它会建立一个http/html 服务。让用户可以在浏览器上查看分析结果
可以使用VisualVM,Eclipse Memory Analyzer、IBM HeapAnalyze等工具都可以用来替代jhat分析dump文件。
6、jstack(Stack track for java):显示虚拟机的线程快照(threaddump 或者javacore 文件)
堆栈跟踪工具
显示虚拟机每条线程的堆栈集合,生成堆栈快照的目的是未来定位线程长时间停顿的原因,能看见正在停顿的线程正在做什么,或者在等待什么资源。
命令格式:
jstack [option]vmid
选项和作用:
-F:当正常输出的请求不被响应时,强制输出线程堆栈
-l:除堆栈外,显示关于锁的附加信息。
-m:如果调用本地方法的话,可以显示C/C++的堆栈
另外Jdk 的Thread 提供getAllStackTraces方法可以获取虚拟机所有线程的堆栈跟踪信息。可以提供页面,实时查看
7、HSDIS:JIT生成代码发汇编
hotspot 虚拟机JIT编译代码反汇编插件。
它的作用是hotspot的-XX:+ PrintAssemby指令调用它来把动态生成的本地代码还原成为汇编代码输出,并且能生成有意义的注释。主要目的是为力分析程序的执行问题(虚拟机怎么做的,性能如何)
插件使用命令:
debug 和fastDebug版本的Hotspot,可以通-XX
:+printAssemby指令使用插件
Product版本的Hostspot还需要:输入
-XX:+UnlockDiagnosticVmOption参数
二、可视化工具
1、JConsole java监视与管理控制台
内存页:相当于可视化的jstat命令
线程页:相当于可视化的jstack
2、VisualVM 多合一故障处理工具
是目前jdk发布的功能最强大的监视和故障处理程序
除了能监视、故障处理还提供优秀的性能分析,并且不需要被监视的程序基于特殊Agent运行,因此它堆应用程序的世纪性能影响很小,可以直接在生产环境中使用。
功能:
1、类似jps,jinfo、jstat、jstack,jmap、jhat
2、方法级性能分析已经方法的调用和运行时间
3、离线快照
4、加入其他插件功能
有非常强的向下兼容能力
插件安装:下载*.nbm包后,点击工具-》插件-》已下载,选择包路径安装
查看堆栈可以使用的命令
1、用命令top查看java进程的内存和cpu占用情况。
2、jmap -histo pid查询指定java进程的所有对象使用内存情况。
3、ps -mp pid -o THREAD,tid,time 查询所有线程列表
4、将需要的线程ID转换为16进制格式:printf "%x\n" tid
5、jstack pid |grep tid -A 30 查看该线程堆栈信息
ps: pid 是进程ID tid 是线程ID -A 30 表示显示最后30行
一次完整的查看堆栈的过程
1、
2、
3、jstack 19241 |grep 4c57 -A 30
文章内容来源于《深入理解JAVA虚拟机》