gpt4 book ai didi

java - 调用 jar 的 main 方法时出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 16:40:03 25 4
gpt4 key购买 nike

我有一个 Java 应用程序,它将另一个 jar 作为库导入并调用其 main 方法,如下所示。但是 someApp 是一个非常大的进程,并且不断抛出 OutOfMemoryError。无论我将 Java 应用程序堆大小设置为多少,someApp 似乎都不会共享分配的内存。

try {
someApp.main(args);
} catch (Exception ex) {
}

如何让 someApp 分配更多堆空间?我可以使用processBuilder吗?我该怎么办?

谢谢。

最佳答案

就目前而言,您只是从您自己的 Java 进程中的另一个应用程序调用一个类。这与调用“库方法”完全相同(该术语没有技术差异,您只是在类的对象上调用可由类加载器解析的方法)。

所以现在,someApp 与您自己的应用程序在同一 JVM 中运行,并将共享其最大堆大小。这可以通过 JVM 参数 -Xmx 来增加(例如 -Xmx2048m 对于 2GB 最大堆),尽管听起来您已经这样做了但没有成功。

可以在单独的 Java 进程中启动 someApp,这将允许您配置单独的 JVM 参数,从而为其提供单独的堆大小。

但是,我认为这不会有太大帮助。如果您无法让该应用程序在同一个 JVM 中运行,无论您的堆限制如何,都没有任何迹象表明它可以在不同的 JVM 中运行。例如,如果您使用 2.5GB 堆运行但仍然内存不足,则使用 0.5GB 堆运行您自己的应用程序并生成具有 2GB 堆的单独 JVM 将无法解决问题,因为内存仍然不足。 (事实上​​,单独的内存池使 OOME 更有可能发生,因为有两个不同的可用空间 block ,而在前一种情况下,两个应用程序都可以从同一可用空间池中受益)。

我建议您验证您的堆大小是否确实被选取(使用 JConsole 或 JVisualVM 通过 JMX 连接将很快让您看到最大堆大小有多大)。如果您确实仍然用完大堆的内存,那么听起来 someApp 存在内存泄漏(或者需要更大堆)。在这种情况下,使用 JVM 参数 -XX:+HeapDumpOnOutOfMemoryError 捕获堆转储将允许您使用外部工具检查堆并确定填充内存的内容。

希望您只是未能正确增加堆大小,就好像应用程序确实因大堆而失败一样,没有简单的解决方案。

关于java - 调用 jar 的 main 方法时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4808901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com