Windows环境下SonarQube 7.1安装失败求助
解决SonarQube 7.1启动失败:JVM无法创建(DCEVM与GC冲突)
看到你启动SonarQube时遇到了JVM启动失败的问题,先抓一下日志里的核心错误:
Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. Must use the serial GC in the DCEVM
问题根源
这个错误指向很明确:你当前系统使用的是DCEVM(动态代码演化虚拟机),但SonarQube自带的Elasticsearch启动时指定了CMS垃圾收集器(-XX:+UseConcMarkSweepGC),而DCEVM强制要求使用Serial GC,两者冲突直接导致JVM启动失败。
具体解决步骤
切换到标准JDK 1.8
SonarQube 7.1只兼容标准的Oracle JDK 1.8或OpenJDK 1.8,绝对不能用DCEVM版本。先确认你有标准JDK的安装路径,比如C:\Program Files\Java\jdk1.8.0_200这类不带DCEVM标识的版本。临时指定JAVA_HOME启动
在启动SonarQube的命令行窗口中,先手动设置JAVA_HOME指向标准JDK,再启动服务:set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_200 cd E:\sonarqube-7.1 (1)\sonarqube-7.1\bin\windows-x86-64 startsonar.bat验证JDK版本
运行java -version命令,确保输出里没有"DCEVM"相关字样,正常的JDK输出应该类似:java version "1.8.0_200" Java(TM) SE Runtime Environment (build 1.8.0_200-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.200-b09, mixed mode)长期修改环境变量(可选)
如果不想每次启动都手动设置,可以修改系统的JAVA_HOME环境变量,直接指向标准JDK 1.8,之后双击startsonar.bat就能正常启动了。
补充说明
日志里出现的Log4j相关警告(Log4j2 could not find a logging implementation)是Elasticsearch启动失败引发的连锁问题,只要解决了JDK的冲突,这个警告会自动消失。
完整错误日志参考:
E:\sonarqube-7.1 (1)\sonarqube-7.1\bin\windows-x86-64>startsonar.bat wrapper | --> Wrapper Started as Console wrapper | Launching a JVM... jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. jvm 1 | jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory E:\sonarqube-7.1 (1)\sonarqube-7.1\temp jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001 jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [E:\sonarqube-7.1 (1)\sonarqube-7.1\elasticsearch]: C:\Program Files (x86)\Java\jdk1.8.0_20\jre\bin\java -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.path.home=E:\sonarqube-7.1 (1)\sonarqube-7.1\elasticsearch -cp lib/* org.elasticsearch.bootstrap.Elasticsearch -Epath.conf=E:\sonarqube-7.1 (1)\sonarqube-7.1\temp\conf\es jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running jvm 1 | Error: Could not create the Java Virtual Machine. jvm 1 | Error: A fatal exception has occurred. Program will exit. jvm 1 | Must use the serial GC in the DCEVM jvm 1 | 2018.05.21 13:20:36 WARN app[][o.s.a.p.AbstractProcessMonitor] Process exited with exit value [es]: 1 jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.SchedulerImpl] Process [es] is stopped jvm 1 | 2018.05.21 13:20:36 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped jvm 1 | FATAL StatusLogger Interrupted before Log4j Providers could be loaded. jvm 1 | java.lang.InterruptedException jvm 1 | at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220) jvm 1 | at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335) jvm 1 | at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:121) jvm 1 | at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:108) jvm 1 | at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89) jvm 1 | at org.elasticsearch.common.logging.ESLoggerFactory.getLogger(ESLoggerFactory.java:54) jvm 1 | at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:105) jvm 1 | at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:72) jvm 1 | at org.elasticsearch.common.component.AbstractComponent.<init>(AbstractComponent.java:37) jvm 1 | at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:97) jvm 1 | at org.elasticsearch.client.transport.TransportClient.newPluginService(TransportClient.java:101) jvm 1 | at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:126) jvm 1 | at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:254) jvm 1 | at org.sonar.application.process.EsProcessMonitor$MinimalTransportClient.<init>(EsProcessMonitor.java:109) jvm 1 | at org.sonar.application.process.EsProcessMonitor.buildTransportClient(EsProcessMonitor.java:175) jvm 1 | at org.sonar.application.process.EsProcessMonitor.getTransportClient(EsProcessMonitor.java:160) jvm 1 | at org.sonar.application.process.EsProcessMonitor.checkStatus(EsProcessMonitor.java:134) jvm 1 | at org.sonar.application.process.EsProcessMonitor.checkOperational(EsProcessMonitor.java:93) jvm 1 | at org.sonar.application.process.EsProcessMonitor.isOperational(EsProcessMonitor.java:78) jvm 1 | at org.sonar.application.process.SQProcess.refreshState(SQProcess.java:161) jvm 1 | at org.sonar.application.process.SQProcess$EventWatcher.run(SQProcess.java:220) jvm 1 | ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console... wrapper | <-- Wrapper Stopped
内容的提问来源于stack exchange,提问作者rakesh
相关产品推荐
相关产品推荐

