java 啓動JAR包腳本 JVM參數筆記DEMO
/opt/java/jdk1.8.0_131/bin/java
#運行模式
-server
#堆區內存可被分配的最大上限
-Xmx512m
#堆區內存初始內存分配的大小
-Xms512m
#新生代(Eden + 2*S)與老年代(不包括永久區)的比值
-XX:NewRatio=4
#Eden區和Survivor區的比值
-XX:SurvivorRatio=8
#持久代空間大小
-XX:PermSize=48m
#持久代空間大小
-XX:MaxPermSize=64m
#每個線程的堆棧大小
-Xss256k
#JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K.更具應用的線程所需內存大小進行 調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右
一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。(校長)
和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:"”
-Xss is translated in a VM flag named ThreadStackSize”
一般設置這個值就可以了
-XX:ThreadStackSize=128k
-XX:-ReduceInitialCardMarks
#垃圾回收統計信息
-XX:+PrintGCDetails
#垃圾回收統計信息
-XX:+PrintGCTimeStamps
#垃圾回收統計信息
-XX:+PrintHeapAtGC
-Xloggc:/home/workspace/jvm-log/open-api-global-quartz-GC.log
#關閉System.gc() 這個參數需要嚴格的測試
-XX:+DisableExplicitGC
#使用CMS內存收集
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
#CMS併發過程運行時的線程數
-XX:ParallelCMSThreads=4
#CMS降低標記停頓
-XX:+CMSParallelRemarkEnabled
#在FULL GC的時候, 對年老代的壓縮 CMS是不會移動內存的, 因此, 這個非常容易產生碎片, 導致內存不夠用, 因此, 內存的壓縮這個時候就會被啓用。 增加這個參數是個好習慣。
可能會影響性能,但是可以消除碎片
-XX:+UseCMSCompactAtFullCollection
#CMS作爲垃圾回收使用50%後開始CMS收集
-XX:CMSInitiatingOccupancyFraction=50
#CMS併發收集器不對內存空間進行壓縮,整理,所以運行一段時間以後會產生"碎片",使得運行效率降低.此值設置運行多少次GC以後對內存空間進行壓縮,整理.
-XX:CMSFullGCsBeforeCompaction=2
#這個可以壓縮指針,起到節約內存佔用的新參數
-XX:+UseCompressedOops
#當堆內存空間溢出時輸出堆的內存快照
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/workspace/jvm_dump/open-api-global-quartz-heapDump.hprof
-jar open-api-global-quartz-exec.jar
--eureka.server=http://localhost:8761/eureka
--environment=Staging --dataCenter=Cloud
demo open-api-devops-service.sh
#!/bin/bash
export JAVA_HOME=$JAVA_HOME
echo ${JAVA_HOME}
APP=open-api-devops-service
APP_JAR=${APP}"-exec.jar"
ENV_SPRING_ACTIVE="--spring.profiles.active=dev"
LOG_DIR=$PWD/start-log
JVM_LOG_DIR=$PWD/jvm-log
JVM_DUMP_DIR=$PWD/jvm-dump
command=$1
# 啓動
function start(){
# 日誌文件是否存在 不存創建
if [ ! -d "${LOG_DIR}" ];then
mkdir "${LOG_DIR}"
fi
if [ ! -d "${JVM_LOG_DIR}" ];then
mkdir "${JVM_LOG_DIR}"
fi
if [ ! -d "${JVM_DUMP_DIR}" ];then
mkdir "${JVM_DUMP_DIR}"
fi
rm -f $APP.pid
#${JAVA_HOME}/bin/jar uvf $APP_JAR jdbc.properties
nohup ${JAVA_HOME}/bin/java -server -Xmx512m -Xms512m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=48 -XX:MaxPermSize=64m -Xss256k -XX:ThreadStackSize=128k -XX:-ReduceInitialCardMarks -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:$JVM_LOG_DIR/$APP-GC.log -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelCMSThreads=4 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=50 -XX:CMSFullGCsBeforeCompaction=2 -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$JVM_DUMP_DIR/$APP-heapDump.hprof -jar $APP_JAR $ENV_SPRING_ACTIVE >> /dev/null 2>$APP-error.log &
echo $! > $APP.pid
check
}
# 停止
function stop(){
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ];then
echo "Stop Process"
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ];then
echo "Stop Process"
kill -15 $tpid
else
echo "Stop SUCCESS"
fi
sleep 5
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ];then
echo "Stop FAILD"
fi
}
# 檢查
function check(){
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ]; then
echo "APP is running"
else
echo "APP is Not running"
fi
}
# 強制kill進程
function forcekill(){
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ];then
echo "Kill Process"
kill -9 $tpid
fi
}
# 輸出進程號
function showtpid(){
tpid=`ps -ef | grep $APP_JAR | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ];then
echo 'Process '$APP_JAR' tpid is '$tpid
else
echo 'Process '$APP_JAR' is not running.'
fi
}
# 輸出進程號
function showtpid(){
tpid=`ps -ef|grep $APP_JAR|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'process '$APP_JAR' tpid is '$tpid
else
echo 'process '$APP_JAR' is not running.'
fi
}
if [ "${command}" == "start" ]; then
start
elif [ "${command}" == "stop" ]; then
stop
elif [ "${command}" == "check" ]; then
check
elif [ "${command}" == "status" ]; then
check
elif [ "${command}" == "kill" ]; then
forcekill
elif [ "${command}" == "tpid" ];then
showtpid
else
echo "Unknow argument....[start|stop|check|status|kill|tpid]"
fi