0

当我尝试将 Apache Stanbol 安装为本地实例时出现以下异常:

ERROR] Java heap space -> [Help 1]
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2786)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
    at aQute.lib.osgi.EmbeddedResource.copy(EmbeddedResource.java:62)
    at aQute.lib.osgi.EmbeddedResource.collect(EmbeddedResource.java:51)
    at aQute.lib.osgi.EmbeddedResource.build(EmbeddedResource.java:33)
    at aQute.lib.osgi.EmbeddedResource.build(EmbeddedResource.java:71)
    at aQute.lib.osgi.Verifier.getBundleClassPath(Verifier.java:255)
    at aQute.lib.osgi.Verifier.<init>(Verifier.java:204)
    at aQute.lib.osgi.Builder.doVerify(Builder.java:434)
    at aQute.lib.osgi.Builder.build(Builder.java:104)
    at org.apache.felix.bundleplugin.BundlePlugin.buildOSGiBundle(BundlePlugin.java:547)
    at org.apache.felix.bundleplugin.BundlePlugin.execute(BundlePlugin.java:347)
    at org.apache.felix.bundleplugin.BundlePlugin.execute(BundlePlugin.java:264)
    at org.apache.felix.bundleplugin.BundlePlugin.execute(BundlePlugin.java:255)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
[ERROR] 
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError

我使用以下命令增加了 JVM 内存,但仍然遇到相同的错误。我的内存是 4 GB。

出口 MAVEN_OPTS="-Xmx3000m -XX:MaxPermSize=512m"

如何解决和解决此问题?

谢谢,

周杰伦

4

3 回答 3

0

当您在构建过程中有大量资源过滤并且没有足够的堆空间分配给 Maven 时,这会在 OSGI 环境中发生。

如果您像这样指定资源和过滤器,它应该可以解决问题......

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>**/*.xml</exclude>
        </excludes>
        <filtering>false</filtering>
    </resource>
    <resource>
        <directory>src/main/filtered-resources</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

<filters>
    <filter>src/main/etc/org.yourcompany.yourproject.cfg</filter>
</filters>

注意:指定了过滤器文件(以 .cfg 结尾的文件)如果没有此文件,您将在尝试解析资源令牌时收到 OutOfMemory 错误。因此嵌入式资源数组复制。

于 2015-02-02T21:01:48.653 回答
0

要设置的环境变量是 MAVEN_OPTS,例如 MAVEN_OPTS=-Xmx1024m。pom 中的 maxmem 配置仅在您将编译器插件设置为将 javac 分叉到新的 JVM 时适用。否则,插件在与 Maven 相同的 VM 中运行,因此在通过 MAVEN_OPTS 在命令行上传递的内存中。

在 Windows 7 下设置 MAVEN_OPTS:

  1. 右键单击我的电脑并选择属性
  2. 单击位于系统属性左侧导航中的高级系统设置链接以显示高级系统属性
  3. 转到高级选项卡,然后单击位于高级系统属性配置窗口底部的环境变量按钮
  4. 创建一个新的用户变量,将变量名称设置为 MAVEN_OPTS 并将变量值设置为 -Xmx1024m(或更多)

打开一个新的命令窗口并运行 mvn。

于 2013-10-10T06:26:14.567 回答
-1

增加内存不是解决OOM错误的办法。它可以是暂时的缓解,但不是永久的解决方案。您需要修复导致内存泄漏的代码。

从异常来看,似乎有一些代码复制数组并递归执行导致堆内存溢出。

如何查找 Java 内存泄漏

于 2013-10-10T06:26:05.860 回答