7

我正在分析 Sonar 中的一个大型项目并收到以下错误:

[sonar:sonar] 03:55:39.511 INFO  p.PhasesTimeProfiler - Execute decorators...

BUILD FAILED
[...]
[...] java.lang.OutOfMemoryError: Java heap space
at org.sonar.batch.index.MeasurePersister.model(MeasurePersister.java:127)
at org.sonar.batch.index.MeasurePersister.getMeasuresToSave(MeasurePersister.java:117)
at org.sonar.batch.index.MeasurePersister.dump(MeasurePersister.java:70)
at org.sonar.batch.index.DefaultPersistenceManager.dump(DefaultPersistenceManager.java:63)
at org.sonar.batch.phases.Phases.execute(Phases.java:95)
at org.sonar.batch.bootstrap.ProjectModule.doStart(ProjectModule.java:139)
at org.sonar.batch.bootstrap.Module.start(Module.java:83)
at org.sonar.batch.bootstrap.BatchModule.analyze(BatchModule.java:131)
at org.sonar.batch.bootstrap.BatchModule.doStart(BatchModule.java:121)
at org.sonar.batch.bootstrap.Module.start(Module.java:83)
at org.sonar.batch.bootstrap.BootstrapModule.doStart(BootstrapModule.java:121)
at org.sonar.batch.bootstrap.Module.start(Module.java:83)
at org.sonar.batch.Batch.execute(Batch.java:104)
at org.sonar.ant.Launcher.execute(Launcher.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.sonar.ant.SonarTask.delegateExecution(SonarTask.java:244)
at org.sonar.ant.SonarTask.execute(SonarTask.java:193)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:392)
at org.apache.tools.ant.Target.performTasks(Target.java:413)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38)
at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:442)

我应该增加正在运行的 Sonar 服务器的 Java 堆空间,还是增加执行 Sonar 作业的 Ant 目标?

4

1 回答 1

14

从堆栈跟踪中可以看出,Ant 启动了 Sonar 分析,因此您应该为运行 Ant 的 VM 增加堆空间。

这是一个非常相似的问题顺便说一句:How to increase Sonar Java heap space

用于命令行 Ant 使用

引用 Mark O'Connor 对另一个问题的回答:

Sonar ANT 任务作为 ANT 的一部分执行,因此您需要使用标准 ANT 环境参数设置 JVM 堆。例如:

出口 ANT_OPTS=-Xmx256m

评论:

  • 这适用于 Linux,对于 Windows,使用set命令
  • 这严格用于堆空间。对于Permgen, 使用-XX:MaxPermSize=<desired amount>

这是一个更相似的问题:Build Failed java.lang.OutOfMemoryError: Java heap space

对于 Eclipse IDE

引用文章http://soenkerohde.com/2008/06/change-eclipse-ant-settings-when-you-run-out-of-memory/

  • 在 Eclipse 中打开菜单:运行->外部工具->打开外部工具对话框
  • 在左侧选择要更改的构建脚本
  • 选择右侧的JRE选项卡
  • 将以下内容设置为VM 参数:-Xms768m -Xmx1024m -XX:MaxPermSize=512m

对于 IntelliJ 理念

这个论坛帖子很有用:ANT build java heap space

引用答案:

请确保您在正确的位置增加了堆。您需要在IDEA 的 Ant 工具窗口中单击“属性”按钮并在此处编辑“最大堆大小 (Mb)”字段。

此外,来自 IntelliJ Idea 页面:增加内存堆

引用文章:

构建过程的内存堆独立于 IntelliJ IDEA 内存堆,在构建过程完成后释放。

要增加内存堆: 打开Build File Properties对话框。在最大堆大小字段中,键入所需的内存量。

用于 Jenkins 持续集成和 Ant 构建

这个问题很有用:How to use the Java Optionsin jenkins ant build tool to set ANT_OPTS

引用答案:

将 JAVA OPTIONS 设置为 -Xmx512m -XX:MaxPermSize=256m 仅没有 ANT_OPTS=

对于Maven 构建,这篇文章很有用:How to increase maven heapspace in hudson builds

  1. 导航到你的哈德逊工作,
  2. 点击配置
  3. 向下滚动到Build 部分,然后
  4. 单击高级按钮。
  5. 在 MAVEN_OPTS 中输入:-Xmx512m -XX:MaxPermSize=128m
于 2013-01-10T08:05:40.447 回答