JVM优化总结

写在前面

  1. JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
  2. 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配置详解

  1. -Xms2g -Xmx2g -Xmn1g: 起始堆内存和最大堆内存都是2g, 新生代1g(默认新生代和老年代的比例是1:2)
  2. -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m: 元空间初始128m,最大320m
  3. -XX:-OmitStackTraceInFastThrow -XX:+DisableExplicitGC: 当相同的异常频繁抛出时,仍抛出完整异常信息, System.gc()不生效
  4. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/${SERVER}_heapdump.hprof": OOM时导出堆信息
  5. -XX:-UseLargePages: 使用大存储页
  6. -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配置原则

  1. JVM调优的依据
    在这里插入图片描述
  2. 调优原则
    1. Java整个堆大小设置,Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
    2. 永久代(jdk8成为元数据区) PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。
    3. 年轻代Xmn的设置为老年代存活对象的1-1.5倍。
    4. 老年代的内存大小设置为老年代存活对象的2-3倍
    5. Sun官方建议年轻代的大小为整个堆的3/8左右
  3. 老年代存活的大小怎么看呐?
    1. 可以通过GClog进行查看, 以新生代为例
      在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值