JVM调优方法总结
本文主要针对运行的服务器进行调优以及性能分析工具使用。
在这里我使用的都是JDK自带的命令 JAVA_HOME/bin/*
查看Server PID - jps
如果需要分析某一个Server,首先当然需要知道它的PID.使用jps可以用显示当前jvm的进程,当然也可以使用ps -ef |grep java.
命令格式:
jps [ options ] [ hostid ]
options:
-q 忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。 -m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。 -l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。 -v 输出传给JVM的参数。 -V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数 -XX:Flags=<filename>指定的文件)。 -J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M, 使用-J 选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。
hostid:
[protocol:][[//]hostname][:port][/servername]
protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议, 如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。 hostname - 服务器的IP或者名称,没有指定则表示本机。 port - 远程rmi的端口,如果没有指定则默认为1099。 servername - 注册到RMI注册中心中的jstatd的名称。
查看线程状态 - jstack
jstack可以dump当前Server的线程运行状态。如是否存在死锁,线程数量,以及各个线程的状态,资源竞争情况等。如果现在运行的java程序呈现挂起的状态,jstack是非常有用的。
jstack [ option ] pid jstack [ option ] executable core jstack [ option ] [server-id@]remote-hostname-or-IP
option:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息 -l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表. -m打印java和native c/c++框架的所有栈信息. -h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.
查看内存分配-jmap
jmap可以输出所有内存中对象,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如: jmap -histo pid > heap.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool )).
jmap [ option ] pid jmap [ option ] executable core jmap [ option ] [server-id@]remote-hostname-or-IP
option:
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. -finalizerinfo 打印正等候回收的对象的信息. -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况. -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. -permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. -h | -help 打印辅助信息 -J 传递参数给jmap启动的jvm.
pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.
查看新生代和老年代 - jstat
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。 jstat -compiler pid:显示VM实时编译的数量等信息。 jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 jstat -gcnew pid:new对象的信息。 jstat -gcnewcapacity pid:new对象的信息及其占用量。 jstat -gcold pid:old对象的信息。 jstat -gcoldcapacity pid:old对象的信息及其占用量。 jstat -gcpermcapacity pid: perm对象的信息及其占用量。 jstat -gcutil pid:统计gc信息统计。 jstat -printcompilation pid:当前VM执行的信息。