如何修改Tomcat的setenv.sh以根据Java主版本设置GC参数?
Tomcat setenv.sh 实现按Java版本加载GC参数
以下是对应你提供的setenv.bat功能的Shell脚本版本,可直接用于Tomcat的setenv.sh文件:
# 基础JAVA_OPTS配置 JAVA_OPTS="$JAVA_OPTS -Xms400m -Xmx1g -Djava.library.path=$LOCALLIBPATH -Dderby.system.home=db -Dam.ehcache.set_rmi_ip_addr=true -XX:MaxMetaspaceSize=256M -XX:NewSize=128M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs -Dhost.name=$HOSTNAME -Djavax.net.ssl.trustStore=conf/amtrust.keystore -Djavax.net.ssl.trustStorePassword=passphrase" # 确定Java命令路径 _JAVACMD="$JAVACMD" if [ -z "$_JAVACMD" ]; then if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then _JAVACMD="$JAVA_HOME/bin/java" fi fi if [ -z "$_JAVACMD" ]; then _JAVACMD="java" fi # 获取Java主版本号 JAVA_VERSION=0 VERSION_OUTPUT=$($_JAVACMD -Xms32M -Xmx32M -version 2>&1 | grep -i "version") if [ -n "$VERSION_OUTPUT" ]; then # 提取版本号并去除引号 JAVA_VERSION=$(echo "$VERSION_OUTPUT" | awk '{print $3}' | tr -d '"') # 处理版本格式:1.x.x取第二个数字,其他取第一个数字 if [[ "$JAVA_VERSION" == 1.* ]]; then JAVA_VERSION=$(echo "$JAVA_VERSION" | cut -d'.' -f2) else JAVA_VERSION=$(echo "$JAVA_VERSION" | cut -d'.' -f1) fi fi # 根据Java版本添加对应GC参数 if [ "$JAVA_VERSION" -gt 8 ]; then JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+DisableExplicitGC -Xlog:gc*:file=logs/${HOSTNAME}_gc.log" else JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:+DisableExplicitGC -Xloggc:logs/${HOSTNAME}_gc.log -XX:+PrintGCDetails" fi
关键逻辑说明:
- Java命令定位:优先使用已定义的
JAVACMD,其次从JAVA_HOME路径查找可执行文件,最后默认使用系统环境中的java命令 - 版本提取:通过解析
java -version的输出获取版本号,对1.8.x这类旧格式版本转换为数字8,9及以上版本直接提取主版本号 - GC参数分支:Java 9+使用统一日志参数
-Xlog,Java 8及以下使用传统的-Xloggc参数
内容的提问来源于stack exchange,提问作者user10931326
相关产品推荐
相关产品推荐

