如何解决Java JVM负载故障?

如何解决Java JVM负载故障?,java,jvm,Java,Jvm,我正在开发一个用C++Builder 6编写的大型(15MB)传统32位应用程序,它需要使用第三方API与外部系统交互。API由一组内部使用Java的DLL组成(我假设是JNI)。我们的代码只与一个特定的DLL直接交互,并且在运行时延迟加载 当应用程序在客户系统上运行时,DLL因未知原因崩溃。因此,我试图在我的系统(XP Pro 32位)上复制,但遇到了另一个问题 应用程序创建一个线程,尝试初始化API,该线程在内部尝试加载Java JVM并失败,API向我的代码报告“JVM创建失败”错误 然而

我正在开发一个用C++Builder 6编写的大型(15MB)传统32位应用程序,它需要使用第三方API与外部系统交互。API由一组内部使用Java的DLL组成(我假设是JNI)。我们的代码只与一个特定的DLL直接交互,并且在运行时延迟加载

当应用程序在客户系统上运行时,DLL因未知原因崩溃。因此,我试图在我的系统(XP Pro 32位)上复制,但遇到了另一个问题

应用程序创建一个线程,尝试初始化API,该线程在内部尝试加载Java JVM并失败,API向我的代码报告“JVM创建失败”错误

然而,在一个小型测试应用程序中运行的线程代码完全相同,Java加载正常,API功能正常

这两个应用程序都从同一个文件夹运行,因此查找API DLL或Java JVM DLL不是路径问题。我还确保两个项目在内存使用、堆大小、对齐方式、处理器类型等方面使用相同的编译器/链接器设置

我在网上看到一篇参考文章,其中建议JVM需要调用进程的地址空间来拥有一大块连续内存,这是真的吗?如果是,多少钱

我尝试在Java控制面板中启用日志记录/跟踪,但没有记录任何有用的内容


有没有办法找出为什么Java在被主应用程序而不是测试应用程序调用时无法加载

应用程序启动时似乎内存不足

jre用于启动JVM的默认内存取决于系统配置。很可能默认内存不够大,无法加载所有类并运行OOM


在测试应用程序上进行复制的更好方法是将堆内存减少到64,然后查看发生了什么。通过这种方式,我们可能更接近于了解这是否真的是内存问题。

您是否尝试过我不使用Visual Studio进行这些项目。这与内存有关。JVM的默认内存设置与我们的应用程序不兼容。幸运的是,我们正在使用的API有一个系统环境变量,它允许我们将
-Xm…
值传递给JVM初始化,以自定义其内存使用情况,故障就消失了。