Java虚拟机启动失败:无法识别VM选项问题求助
我在启动应用时遇到了以下致命错误,无法正常启动:
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Xms2048m -Xmx4096m - XX:+UseConcMarkSweepGC" Error: A fatal exception has occurred. Program will exit. Unrecognized VM option 'UseConcMarkSweepGC Error: Could not create the Java Virtual Machine.
我已经检查过连字符,但问题依然存在;如果移除ConcMarkSweepGC相关配置,下一个配置又会被提示无法识别。以下是我的setenv.sh文件内容:
#!/usr/bin/env bash JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Xms8192m -Xmx8192m - XX:UseConcMarkSweepGC" # memory JAVA_OPTS="$JAVA_OPTS -XX:PermSize=64m -XX:MaxPermSize=128m" # Timezone and JVM file encoding JAVA_OPTS="$JAVA_OPTS -Duser.timezone=UTC -Dfile.encoding=UTF8" # solr.solr.home => solr home for this app instance # port => app server port no. # hostContext => wepapp context name # zkHost => ZooKeeper ensemble host names and its client port no. # zkClientTimeout => ZooKeeper client timeout ZKSETUP="ZKSETUP_REPLACE" #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 - DhostContext=search -DzkClientTimeout=20000" # Local w/o zoo #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 - DhostContext=search -DzkClientTimeout=20000 -DzkHost=localhost:9983 - DzkRun" # Local w/zoo #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 - DhostContext=search -DzkClientTimeout=20000 -DzkHost=sjc-dev- usrv29.corp.coupons.com:2181,sjc-dev-usrv29.corp.coupons.com:2182,sjc- dev-usrv29.corp.coupons.com:2183" # Cloud Zoo SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 - DhostContext=search -DzkClientTimeout=20000 $ZKSETUP" JAVA_OPTS="$JAVA_OPTS $SOLR_OPTS" #JMX Config Options JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port=9000 \ -Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false" CATALINA_OUT="/home/ci/logs/web/tomcat7/catalina.out" # GC, GC Logging Config Options JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps - XX:+PrintGCDetails -XX:+PrintTenuringDistribution\ -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime - XX:+PrintReferenceGC -Xloggc:/home/ci/logs/web/tomcat7" LOGGING_CONFIG="- Djava.util.logging.config.file=/home/ci/tomcat7/logging.properties"
恳请帮忙排查问题原因并提供解决方案。
问题分析与解决方案
核心原因:参数格式错误(短横线后多余空格)
仔细看你的错误信息和setenv.sh文件,会发现很多JVM参数的格式都有问题:短横线-和后面的参数前缀(比如XX、D)之间多了一个空格。
比如错误里的- XX:+UseConcMarkSweepGC,正确写法应该是-XX:+UseConcMarkSweepGC;还有setenv.sh里的- DhostContext、- DzkClientTimeout、- XX:+PrintGCDetails等,都是同样的问题。JVM会把这些拆分成两个独立的参数,比如把- XX:+UseConcMarkSweepGC当成-和XX:+UseConcMarkSweepGC,自然识别不了后者是VM选项。这也是为什么你移除一个参数后,下一个参数又报错——因为后面的参数也有同样的空格问题。
额外注意:GC选项的兼容性
另外,UseConcMarkSweepGC是Java 8及更早版本的GC选项,如果你使用的是Java 9或更高版本,这个选项已经被废弃,需要替换为G1GC(Java 9+默认)或其他支持的GC选项。不过先解决格式问题是当前的首要任务。
修正后的setenv.sh文件
下面是修正了所有空格问题的版本,你可以直接替换使用:
#!/usr/bin/env bash JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Xms8192m -Xmx8192m -XX:+UseConcMarkSweepGC" # memory JAVA_OPTS="$JAVA_OPTS -XX:PermSize=64m -XX:MaxPermSize=128m" # Timezone and JVM file encoding JAVA_OPTS="$JAVA_OPTS -Duser.timezone=UTC -Dfile.encoding=UTF8" # solr.solr.home => solr home for this app instance # port => app server port no. # hostContext => webapp context name # zkHost => ZooKeeper ensemble host names and its client port no. # zkClientTimeout => ZooKeeper client timeout ZKSETUP="ZKSETUP_REPLACE" #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 -DhostContext=search -DzkClientTimeout=20000" # Local w/o zoo #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 -DhostContext=search -DzkClientTimeout=20000 -DzkHost=localhost:9983 -DzkRun" # Local w/zoo #SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 -DhostContext=search -DzkClientTimeout=20000 -DzkHost=sjc-dev-usrv29.corp.coupons.com:2181,sjc-dev-usrv29.corp.coupons.com:2182,sjc-dev-usrv29.corp.coupons.com:2183" # Cloud Zoo SOLR_OPTS="-Dsolr.solr.home=/home/ci/solr -Dport=8983 -DhostContext=search -DzkClientTimeout=20000 $ZKSETUP" JAVA_OPTS="$JAVA_OPTS $SOLR_OPTS" #JMX Config Options JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 \ -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" CATALINA_OUT="/home/ci/logs/web/tomcat7/catalina.out" # GC, GC Logging Config Options JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution\ -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime -XX:+PrintReferenceGC -Xloggc:/home/ci/logs/web/tomcat7" LOGGING_CONFIG="-Djava.util.logging.config.file=/home/ci/tomcat7/logging.properties"
验证步骤
- 替换你的
setenv.sh为修正后的版本; - 确保文件有可执行权限:
chmod +x setenv.sh; - 重新启动应用,观察是否还有报错。
如果使用的是Java 9+,启动后如果依然有UseConcMarkSweepGC相关的警告或错误,建议替换为-XX:+UseG1GC(Java 9+默认)或者其他兼容的GC选项。
内容的提问来源于stack exchange,提问作者the_way

