首先执行命令:java -version
如果显示如下信息:
则表明linux系统中只安装了java的jre 环境,使用jstack和jmap等需要安装jdk环境
安装整个java运行环境,输入:java -version,显示如下信息
则表示安装完成
进入java安装目录的bin目录:cd /java/bin
JVM性能调优监控工具
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具.
在Java应用中,我们会经常碰到下面这些问题:
OutOfMemoryError,内存不足
内存泄露
线程死锁
锁争用(Lock Contention)
Java进程消耗CPU过高
......
本文将对一些常用的JVM性能调优监控工具进行介绍,对以后java应用出现上述问题后,可以进行优化和找到问题的根源,而不是简单粗暴的重启应用和添加内存了.
1. jps(Java Virtual Machine Process Status Tool)
jps主要用来输出JVM中运行的进程状态信息。
特殊说明
jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
比较常用的参数如下:
1 2 3 4 |
|
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
2.jstack
jstack主要用来查看某个Java进程内的线程堆栈信息,可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.
下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
3.jmap(Memory Map)和jhat(Java Heap Analysis Tool)
jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况,一般结合jhat使用.
使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况,如下:
1 |
|
使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:
1 |
|
用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:
1 |
|
dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
1 |
|
注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dumpfilename.bin.然后就可以在浏览器中输入http://localhost:9998查看了.