写在前面
- JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
- JVM的参数需要根据实际的项目情况动态的调整, 今天就之前的使用经验做一次简单的总结
脚本命令(Linux)
启动关闭脚本
#!/bin/bash
# 修改为自己的jdk地址
export JAVA_HOME=/opt/jdk
export JRE_HOME=/$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# bin目录和javaApp目录同级
SERVER=demo-evaluate-gateway
ACTIVE_PROFILE=demo
export BASE_DIR=`cd $(dirname $0)/..; pwd`
JAR_HOME="${BASE_DIR}/javaApp"
# JVM config
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/${SERVER}_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/${SERVER}_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
JAVA_OPT="${JAVA_OPT} -jar ${JAR_HOME}/${SERVER}.jar --spring.profiles.active=${ACTIVE_PROFILE}"
JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"
if [ ! -d "${BASE_DIR}/logs" ]; then
mkdir ${BASE_DIR}/logs
fi
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $SERVER|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
stop
is_exist
if [ $? -eq 0 ]; then
stop_again
is_exist
if [ $? -eq 0 ]; then
stop_force
fi
fi
echo "java ${JAVA_OPT}"
nohup java ${JAVA_OPT} >> ${BASE_DIR}/logs/"${SERVER}"_start.out 2>&1 &
echo "${SERVER} is starting,you can check the ${BASE_DIR}/logs/"${SERVER}"_start.out"
else
echo "java ${JAVA_OPT}"
nohup java ${JAVA_OPT} >> ${BASE_DIR}/logs/"${SERVER}"_start.out 2>&1 &
echo "${SERVER} startd,you can check the ${BASE_DIR}/logs/"${SERVER}"_start.out"
fi
}
# 停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill $pid
echo "killing ${pid}, ${SERVER} is stopping!"
sleep 10
else
echo "${SERVER} is not running"
fi
}
# 再次停止方法
stop_again(){
is_exist
if [ $? -eq "0" ]; then
kill $pid
echo "${SERVER} is still running, killing ${pid}"
sleep 10
else
echo "${SERVER} is not running"
fi
}
# 强制停止方法
stop_force(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
sleep 10
echo "killing ${pid} force, ${SERVER} is already stoped!"
else
echo "${SERVER} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${SERVER} is running. Pid is ${pid}"
else
echo "${SERVER} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
JVM配置详解
-Xms2g -Xmx2g -Xmn1g
: 起始堆内存和最大堆内存都是2g, 新生代1g(默认新生代和老年代的比例是1:2)-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
: 元空间初始128m,最大320m-XX:-OmitStackTraceInFastThrow -XX:+DisableExplicitGC
: 当相同的异常频繁抛出时,仍抛出完整异常信息, System.gc()不生效-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/${SERVER}_heapdump.hprof"
: OOM时导出堆信息-XX:-UseLargePages
: 使用大存储页-Xloggc:${BASE_DIR}/logs/${SERVER}_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M:
输出虚拟机中GC的详情,打印GC详细信息, 打印GC的日期和时间戳,使用文件滚动,最大文件数为10个,最大文件数量为100M
JVM配置原则
- JVM调优的依据
- 调优原则
- Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
- 永久代(jdk8成为元数据区) PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。
- 年轻代Xmn的设置为老年代存活对象的1-1.5倍。
- 老年代的内存大小设置为老年代存活对象的2-3倍
- Sun官方建议年轻代的大小为整个堆的3/8左右
- 老年代存活的大小怎么看呐?
- 可以通过GClog进行查看, 以新生代为例
- 可以通过GClog进行查看, 以新生代为例