Java性能调优-简单总结
自带命令行宝典
可参考总结:http://blog.csdn.net/lichangzhen2008/article/details/45242273
这是别人整理的文档,也不错的。参考阅读JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
其它工具简介
远程方法jdwp
个人没有用过,参考文档Java远程调试方法Xrunjdwp
JMX+Jconsole/JVisualVM
可以通过JAVA应用的启动参数配置
-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
本地调试方法
Hprof
参考阅读:HPROF使用
特别注意:force=n,输出文件时,可以自动带上进程ID,这样可以区分多个输出文件
几个名词介绍:
Java Virtual Machine Tool Interface(JVM TI)
Byte Code Injection (BCI)
cpu=samples,不使用BCI。
cpu=times使用BCI,若使用BCI对性能影响较大
参数配置样例
JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=samples,interval=20,depth=6"
JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=times,thread=y,cutoff=0, monitor=y,force=n"
#JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=samples,interval=20,depth=6"
#datestr=`date +%m%d%M%S`
#JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=times,thread=y,cutoff=0,force=n"
第三方工具类
HPjemeter
Xeprof很好,但是只支持HP-UX平台
The -Xeprof profiling option, available for the HP-UX HotSpot™ VM, was specifically designed to produce profile data files for HPjmeter
参见:http://stackoverflow.com/questions/7330788/java-one-thread-slow/7667415#7667415
和HPJemeter的手册的“–Xeprof and –agentlib:hprof Profiling Options and Their Corresponding Metrics”
https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=HPJMETER&jumpid=reg_r1002_usen_c-001_title_r0001
JProfiler
JProfiler 注册码
http://blog.csdn.net/attilax/article/details/17077857
可用L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620
若出现问题:No X11 DISPLAY variable was set, but this program performed an operation which requires it.
可以采用这个方法:在linux的启动文件/etc/profile中增加了 export DISPLAY=localhost:0
http://www.cnblogs.com/serendipity/articles/1963904.html
参数配置样例
#-agentlib:jprofilerti=port=8849 -Xbootclasspath/a: /tmp/jprofiler8/bin/agent.jar
JAVA_OPTS="$JAVA_OPTS -agentpath:/tmp/jprofiler8/bin/linux-x64/libjprofilerti.so=port=8849"
启动脚本样例
#!/bin/sh
#check JAVA_HOME & java
noJavaHome=false
if [ -z "$JAVA_HOME" ] ; then
noJavaHome=true
fi
if [ ! -e "$JAVA_HOME/bin/java" ] ; then
noJavaHome=true
fi
if $noJavaHome ; then
echo "Error: JAVA_HOME environment variable is not set."
fi
#==============================================================================
#set JAVA_OPTS
JAVA_OPTS="-server -Xms2G -Xmx10G -Xmn1G -XX:SurvivorRatio=8"
#performance Optiions
JAVA_OPTS="$JAVA_OPTS -XX:+AggressiveOpts"
JAVA_OPTS="$JAVA_OPTS -XX:+UseBiasedLocking"
JAVA_OPTS="$JAVA_OPTS -XX:+UseFastAccessorMethods"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:+CMSParallelRemarkEnabled"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSCompactAtFullCollection"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=85"
#GC Log Options
#JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"
#debug Options
#JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8064,server=y,suspend=n"
#==============================================================================
#JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
#set HOMEV
#JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=samples,interval=20,depth=6"
#datestr=`date +%m%d%M%S`
#JAVA_OPTS="$JAVA_OPTS -agentlib:hprof=cpu=times,thread=y,cutoff=0,format=a,file=java$datestr.hprof"
#JAVA_OPTS="$JAVA_OPTS -agentlib:jprofilerti=port=8849 -Xbootclasspath/a:/tmp/jprofiler8/bin/agent.jar"
CURR_DIR=`pwd`
cd `dirname "$0"`/..
HOTDB_HOME=`pwd`
cd $CURR_DIR
if [ -z "$HOTDB_HOME" ] ; then
echo "Error: HOTDB_HOME environment variable is not defined correctly."
exit 1
fi
#==============================================================================
#set CLASSPATH
HOTDB_CLASSPATH="$HOTDB_HOME/conf:$HOTDB_HOME/lib/classes"
for i in "$HOTDB_HOME"/lib/*.jar
do
HOTDB_CLASSPATH="$HOTDB_CLASSPATH:$i"
done
#==============================================================================
#startup Server
RUN_CMD="java"
RUN_CMD="$RUN_CMD -Dhotdb.home=\"$HOTDB_HOME\""
RUN_CMD="$RUN_CMD -classpath \"$HOTDB_CLASSPATH\""
RUN_CMD="$RUN_CMD $JAVA_OPTS"
RUN_CMD="$RUN_CMD cn.hotpu.hotdb.HotdbStartup $@"
RUN_CMD="$RUN_CMD >> \"$HOTDB_HOME/logs/console.log\" 2>&1 &"
echo $RUN_CMD
eval $RUN_CMD
#==============================================================================