起步java的shell脚本

启动java的shell脚本
一个netty tcp长连接的项目中用到的启动脚本,以及jvm一些参数的设置,记录下来以后应该还用得到
#!/bin/bash

# JDK所在路径
JAVA_HOME="/opt/java"

# 需要启动的Java主程序(main方法类)
APP_MAINCLASS="ServerBootStrap"

# 拼凑完整的classpath参数,包括指定lib目录下所有的jar
CLASSPATH="."
for i in ../lib/*.jar; do
	CLASSPATH="$CLASSPATH":"$i"
done

# 执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号
RUNNING_USER=root

# java虚拟机启动参数
# =======================================================================
# -XX:+<option> 开启option参数
# -XX:-<option> 关闭option参数
# -XX:<option>=<value> 将option参数的值设置为value
# =======================================================================
# -Duser.timezone=GMT+08 | 东八区
# -Xms6144m -Xmx6144m | 堆内存设置为6G,并禁止扩展
# -Xmn1536m | 堆内存(6G)中的1.5G分配给新生代,新生代太大会影响full gc停顿时间,并且netty tcp长连接保存在老年代里
# -XX:PermSize=288m -XX:MaxPermSize=288m | 永久代固定为288m
# 剩下的就是老年代了 (堆内存size = 新生代size + 老年代size + 永久代size)
# -XX:UseConcMarkSweepGC | 使用ParNew + CMS + Serial Old的收集器组合进行内存回收。如果CMS出现Concurrent Mode Failure,则Serial Old作为后备
# -XX:+CMSClassUnloadingEnabled | 配合UseConcMarkSweepGC选项在jdk1.6中可实现对永久代(PermGen)的GC
# -XX:MaxTenuringThreshold | 晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC后年龄就+1
# -Xloggc:/opt/gc.log
# -XX:+PrintGCDetails | 打印GC详细信息
# -XX:+PrintGCTimeStamps | 打印GC停顿时间
# -XX:+HeapDumpOnOutOfMemoryError | 在发生内存溢出异常时生成堆转储快照
# -XX:HeapDumpPath=/opt/dump/ | 生成堆转储快照的目录
JAVA_OPTS="-Duser.timezone=GMT+08 -Xms6144m -Xmx6144m -Xmn1536m -XX:PermSize=288m -XX:MaxPermSize=288m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxTenuringThreshold=15 -Xloggc:/opt/gc.log  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump/"

psid=0
checkpid() {
	javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`
	if [ -n "$javaps" ]; then
		psid=`echo $javaps | awk '{print $1}'`
	else
		psid=0
	fi
}

start() {
	checkpid
	if [ $psid -ne 0 ]; then
		echo "================================"
		echo "warn: $APP_MAINCLASS already started! (pid=$psid)"
		echo "================================"
	else
		echo -n "Starting $APP_MAINCLASS ..."
		nohup java $JAVA_OPTS -classpath $CLASSPATH "com.XXX.$APP_MAINCLASS" >>../nohup.out 2>&1 &
		checkpid
		if [ $psid -ne 0 ]; then
			echo "(pid=$psid) [OK]"
		else
			echo "[Failed]"
		fi
	fi
}

stop() {
	checkpid
	if [ $psid -ne 0 ]; then
		echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
		kill -9 $psid
		if [ $? -eq 0 ]; then
			echo "[OK]"
		else
			echo "[Failed]"
		fi

		checkpid
		if [ $psid -ne 0 ]; then
			stop
		fi
	else
		echo "================================"
		echo "warn: $APP_MAINCLASS is not running"
		echo "================================"
	fi
}

case $1 in
start)
	echo "start project......"
	start
	;;
stop)
	echo "stop project......"
	stop
	;;
restart)
    echo "restart project......"
    stop
    start
    ;;
*)
esac
exit 0