一 jmap
命令行输入tasklist找到要检测的java进程的pid ;linux下直接ps -ax找到进程的pid
jmap -histo pid > *.log
打开后会发现内容格式是类似这样的:
num #instances #bytes class name
--------------------------------------
1: 427398 14458448 [I
2: 178798 6830216 [C
3: 50278 6668512 <constMethodKlass>
4: 179924 4318176 java.lang.String
5: 50278 4026648 <methodKlass>
6: 15244 3894200 [B
7: 47809 1773776 [Ljava.lang.Object;
...
...
Total 1645187 81806088
他的输出是按照总占用内存排序的
num是排序
#instance是对象的实例个数
#bytes是总占用的字节数
class name对应的就是Class文件里的class的标识
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前边有[代表数组,[I 就相当于int[]
对象用[L+类名表示
首先你需要把服务器的内存镜像dump成文件。jdk自带的jmap命令可以完成这个工作:
jmap -heap:format=b,file=heap.bin <进程号>..
-heap jmap -heap pid 堆内存的分配,GC算法,可显示堆内存的各个部分的使用情况
-histo 可显示堆内存中,各个类的对象的数量,以占用空间
可以使用java自带的jhat来分析dump文件,它会在本地分析,然后启个应用,可以远程通过浏览器来查看结果
如果成功执行了jmap,会在当前目录生成一个heap.bin文件,就是当前进程内存的完整影像,把它打包下载下来就可以用Eclipse MAT来分析了。
Eclipse MAT是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。它可比Sun提供的内存镜像分析工具jhat要强太多了。用它打开先前生成的heap.bin文件,就可以看到占用内存的到底是什么东西了。
二 jps
jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
-v 可以看到执行传入的参数,以及全路径
三 jinfo
jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
四 jstat
jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。
jstat -gcutil pid 250 4
五 jstack
jstack:如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
六 jconsole
jconsole:jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
七 jhat
jhat命令分析一个java堆内存的dump文件,并同时启动一个WEB服务器,可以通过浏览器察看文件所保存的堆的信息
<1>使用jmap -dump 获得运行期间的堆的dump文件
<2>使用jconsole通过HotSpotDiagnosticMXBean获得运行期间的堆的dump文件
<3>虚拟机通过-XX:+HeapDumpOnOutOfMemoryError 参数启动,在发生OutOfMemoryError时会自动生成dump文件
参数说明:
-stack false/true:关闭对对象分配的调用关系栈的追踪。如果在dump文件中没有分配信息,就需要将此参数设置为false。默认为true.
-refs false/true:关闭对对象引用关系的追踪。默认为true。就是说默认情况下会对堆中所有对象分析对其引用的对象。
-port 端口号:设置jhat启动的WWW服务器的服务端口号
-exclude 文件名称:通过文件配置在可达对象查询时不用包括的数据的列表。比如文件中包括了java.lang.String.value,在任何时候分析对于从某一对象可达的对象列表的时候,都不会考虑java.lang.String.value域
-baseline 文件名称:指定用于比较的堆的dump文件。在两个堆中均存在的对象ID将不会被标识为new,其它的对象将会被表示为new。这在比较两个不同的堆dump文件时会很有用。
-debug int:设置debug级别,0表示没有调试输出,对于更多的交互模式可以设置更高的值
-version:打印版本信息
-h、-help:打印帮助信息
-J<flag> :将flag作为参数传递给jmap运行的虚拟机
如:
-J-64就是将-64传递给运行jhat的虚拟机,表示以64位模式运行
转载于:https://blog.51cto.com/drizzlewalk/399101