SonarQube - 奇怪的OutOfMemoryError:PermGen空间

时间:2016-03-11 17:50:49

标签: java sonarqube pmd sonar-runner sonarqube-4.5

我知道这里有类似的问题,但似乎没有提供解决方案,所以我希望我的设置有所不同,以便至少针对这个特定问题可能有解决方案:

由于某些原因,我们现在仍然坚持使用SonarQube 4.5.6,试图分析一个巨大的Java项目(12.000个文件,大约有1.000.000行代码)。规则集包含大约700条规则,分布在java-plugin(最新版本3.11),findbugs(最新版本3.3),checkstyle(需要使用旧版本 - 2.2,导致某些规则在以后的版本中不可用),和pmd(最新版本2.5)。

使用Sonar Runner 2.4 java-plugin的部分,findbugs(超时设置为约20分钟),checkstyle运行,但在pmd内我不断得到一个OutOfMemoryError:PermGen空间

17:56:31.276 INFO  - Sensor PmdSensor...
17:56:31.279 INFO  - Execute PMD 5.4.0...
17:56:31.313 INFO  - Java version: 1.5
17:56:31.360 INFO  - PMD configuration: C:\src\.\.sonar\pmd.xml
17:57:23.679 INFO  - Execute PMD 5.4.0 done: 52400 ms
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
Total time: 57:33.538s
Final Memory: 47M/3908M
INFO: ------------------------------------------------------------------------
ERROR: Error during Sonar runner execution
org.sonar.runner.impl.RunnerException: Unable to execute Sonar
        at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
        at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
        at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
        at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
        at org.sonar.runner.api.Runner.execute(Runner.java:100)
        at org.sonar.runner.Main.executeTask(Main.java:70)
        at org.sonar.runner.Main.execute(Main.java:59)
        at org.sonar.runner.Main.main(Main.java:53)
Caused by: java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at net.sourceforge.pmd.lang.java.typeresolution.PMDASMClassLoader.loadClass(PMDASMClassLoader.java:65)
        at net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver.populateType(ClassTypeResolver.java:655)
        at net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver.visit(ClassTypeResolver.java:179)
        at net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration.jjtAccept(ASTImportDeclaration.java:62)
        at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.childrenAccept(AbstractJavaNode.java:55)
        at net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter.visit(JavaParserVisitorAdapter.java:9)
        at net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter.visit(JavaParserVisitorAdapter.java:136)
        at net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver.visit(ClassTypeResolver.java:170)
        at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.jjtAccept(ASTCompilationUnit.java:42)
        at net.sourceforge.pmd.lang.java.typeresolution.TypeResolutionFacade.initializeWith(TypeResolutionFacade.java:17)
        at net.sourceforge.pmd.lang.java.AbstractJavaHandler$5.start(AbstractJavaHandler.java:88)
        at net.sourceforge.pmd.SourceCodeProcessor.usesTypeResolution(SourceCodeProcessor.java:127)
        at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:142)
        at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:76)
        at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:43)
        at org.sonar.plugins.pmd.PmdTemplate.process(PmdTemplate.java:82)
        at org.sonar.plugins.pmd.PmdExecutor.executeRules(PmdExecutor.java:120)
        at org.sonar.plugins.pmd.PmdExecutor.executePmd(PmdExecutor.java:90)
        at org.sonar.plugins.pmd.PmdExecutor.execute(PmdExecutor.java:75)
        at org.sonar.plugins.pmd.PmdSensor.analyse(PmdSensor.java:67)

堆栈跟踪显示我仍处于pmd,但pmd似乎已经通过分析(行Execute PMD 5.4.0 done: ...),此后不应再运行其他插件。不过,我想知道我应该在哪里增加PermGen空间......我已经有了

wrapper.java.additional.2=-XX:MaxPermSize=8g
wrapper.java.maxmemory=8g
<{1>}中的

并尝试添加

wrapper.conf
set JAVA_OPTS="-XX:PermSize=256m -XX:MaxPermSize=4096m" 中的

。另外还有

sonar-runner.bat
sonar.web.javaOpts=-server -Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 中的

。首先,我不明白哪个设置是负责sonar.properties的设置 - OutOfMemoryError中的设置? wrapper.conf中的那个?还是sonar-runner.bat

sonar.properties的PermSize没有帮助时,我该怎么办?默认大小为8g或其他,因此它已经是64的因素!?

任何想法,如何用SonarQube分析这个项目?使用内置数据库和MySQL一样,也会出现问题,所以我认为这没有任何影响。

任何帮助表示赞赏。谢谢...如果您需要有关配置的更多信息或想要从某些日志中获取更多信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

您需要在服务器端分配额外内存,而在分析端分配额外内存以运行分析。由于您似乎正在使用SonarQube扫描仪进行分析,因此我将引导您访问这些文档的Troubleshooting部分,其中介绍了如何通过导出{{1}来调整流程的内存设置} env var。