附录E: Java调优常用命令

系统环境:CentOS 6.5 && JDK 1.8.0_121

常用Shell命令

  • 查看网络状况

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  • 使用top命令去获取进程CPU使用率;使用/proc文件查看进程所占内存。

        
    #!/bin/bash
    for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`
    do
        mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk '{print $2" " $3}'`
        cpu=`top -n 1 -b |awk '/'$i'/{print $9}'`
    done
  • Core转储快照

    Core Dump是对内存的快照,可以从Core Dump中转出Heap Dump和Thread Dump。

    ulimit -c unlimited (使得jvm崩溃可以生成core dump)
    	
    gcore [pid] (主动生成core dump)

    生成的Core Dump文件在CentOS中位于用户当前工作目录下形如core.[pid](可以通过echo '/home/logs/core.%p' > /proc/sys/kernel/core_pattern修改位置),此文件可以通过gdb、jmap和jstack等进行分析,如

    gdb -c [core文件] $JAVA_HOME/bin/java # 进入gdb命令行后执行bt, 显示程序的堆栈信息
    
    jmap -heap $JAVA_HOME/bin/java [core文件]
    
    jstack $JAVA_HOME/bin/java [core文件]

常用JDK命令

  • 查看类的一些信息,如字节码的版本号、常量池等

  • 查看JVM进程

  • 查看进程的GC情况

    jstat读取的是/tmp/hsperfdata_$username/$pid下的统计数据,不会干扰应用程序运行。如果JVM使用-Djava.tmp.dir修改了临时目录或者使用-XX:+PerfDisableSharedMem禁止了perfdata,那么jstat无法使用。

  • 查看JVM堆内存使用状况

  • 查看JVM永久代使用状况

  • 查看JVM内存存活的对象

  • 把heap里所有对象都dump下来,无论对象是死是活

  • 先做一次Full GC,再dump,只包含仍然存活的对象信息:

  • 线程dump

    这里在jstack(同jmap)中使用-F参数需要注意:如果命令执行过程中途用kill -9非正常退出,目标jvm进程会一直暂停在那里,可以使用kill -18重新激活进程。

  • 查看JVM启动的参数

  • 查看对应参数的值

  • 启用/禁止某个参数

  • 设置某个参数

  • 查看所有可以设置的参数以及其默认值

  • 进行一次Full GC

JVM配置示例

Last updated