Java 调用jar的主方法时发生OutOfMemoryError

Java 调用jar的主方法时发生OutOfMemoryError,java,out-of-memory,Java,Out Of Memory,我有一个Java应用程序,它将另一个jar作为库导入,并调用其主方法,如下所示。但是someApp是一个非常大的过程,经常抛出内存错误。无论我将Java应用程序堆大小设置为什么,someApp似乎都不会共享分配的内存 try { someApp.main(args); } catch (Exception ex) { } 如何让someApp分配更多堆空间?我可以使用Process Builder吗?我该怎么办 谢谢。除非someApp本身正在构建一个新的进程,否则它将与调用代码处于同

我有一个Java应用程序,它将另一个jar作为库导入,并调用其主方法,如下所示。但是
someApp
是一个非常大的过程,经常抛出
内存错误。无论我将Java应用程序堆大小设置为什么,
someApp
似乎都不会共享分配的内存

try {
    someApp.main(args);
} catch (Exception ex) {
}
如何让
someApp
分配更多堆空间?我可以使用Process Builder吗?我该怎么办


谢谢。

除非
someApp
本身正在构建一个新的进程,否则它将与调用代码处于同一个进程中,因此它应该受到启动JVM时设置的任何堆配置的影响


您是否跟踪了进程实际占用的内存量?

除非
someApp
本身正在构建一个新进程,否则它将与调用代码处于同一进程中,因此它应该受到启动JVM时设置的任何堆配置的影响


您是否跟踪了进程实际占用的内存量?

这没有意义,除非您在操作系统上遇到了操作系统限制,无法为单个Java进程分配多少内存(请参阅)

除此之外,您调用someApp的方式就像一个常规库。main方法的行为与任何其他方法一样


你试过调试OutOfMemoryError吗?从您的应用程序调用应用程序时,可能会有一些模糊的地方让应用程序不喜欢…

这是没有意义的,除非您在操作系统上遇到操作系统限制,无法为单个Java进程分配多少内存(请参阅)

除此之外,您调用someApp的方式就像一个常规库。main方法的行为与任何其他方法一样


你试过调试OutOfMemoryError吗?从您的应用程序中调用应用程序可能会有一些不太清楚的地方,而应用程序并不喜欢…

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

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

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

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

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


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

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

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

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

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

我建议您验证堆大小是否真的得到了提升(使用JConsole或JVisualVM通过JMX进行连接将很快让您看到最大堆大小有多大)。如果您的内存仍然不足,而且堆很大,那么听起来像是
someApp
ha