JVM调优方法总结

jopen 8年前

本文主要针对运行的服务器进行调优以及性能分析工具使用。

      在这里我使用的都是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执行的信息。