Java 调用jar的主方法时发生OutOfMemoryError
我有一个Java应用程序,它将另一个jar作为库导入,并调用其主方法,如下所示。但是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本身正在构建一个新的进程,否则它将与调用代码处于同
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