SonarQube - strange OutOfMemoryError: PermGen space

SonarQube - strange OutOfMemoryError: PermGen space

我知道这里有类似的问题,但是none似乎提供了解决方案,所以我希望我的设置有所不同,这样至少可以解决这个特定问题:

由于某些原因,我们目前坚持使用 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 space

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.delegateExecution(BatchLauncher.java:91)
        at org.sonar.runner.impl.BatchLauncher.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.access0(Unknown Source)
        at java.net.URLClassLoader.run(Unknown Source)
        at java.net.URLClassLoader.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.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 space ...我已经有了

wrapper.java.additional.2=-XX:MaxPermSize=8g
wrapper.java.maxmemory=8g

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?

8g 的 PermSize 没有帮助时,我该怎么办?默认大小是 128m 之类的,所以它已经是 64 的因子了!?

知道如何用 SonarQube 分析这个项目吗?内置数据库和 MySQL 都会出现此问题,因此我认为这没有任何影响。

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

您需要将额外的内存分配给运行分析的进程,而不是在服务器端,而是在分析端。由于您似乎是在使用 SonarQube 扫描仪进行分析,我将引导您进入这些文档的 Troubleshooting 部分,其中告诉您如何通过导出 SONAR_RUNNER_OPTS env 来调整进程的内存设置变量