C++ 启动jvm时内存不足错误

C++ 启动jvm时内存不足错误,c++,excel,vba,jvm,java-native-interface,C++,Excel,Vba,Jvm,Java Native Interface,我们有一个OCX,它在Excel中充当SQL查询生成器。OCX是一个运行查询生成器的包装器,它是用Java编写的。通过Excel 2010,一切都很顺利。在Excel 2013中,我们在实例化jvm时有时会出现内存不足错误。有时有效,有时无效。以下是创建jvm的代码: JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.compiler=NONE";

我们有一个OCX,它在Excel中充当SQL查询生成器。OCX是一个运行查询生成器的包装器,它是用Java编写的。通过Excel 2010,一切都很顺利。在Excel 2013中,我们在实例化jvm时有时会出现内存不足错误。有时有效,有时无效。以下是创建jvm的代码:

    JavaVMInitArgs vm_args;
    JavaVMOption options[1];

    options[0].optionString = "-Djava.compiler=NONE";                               
    vm_args.version = JNI_VERSION_1_2;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;

    LOG("starting JVM ");
    jint    returnCode = JNI_CreateJavaVMptr(&jvm, (void**)&env, &vm_args);
    if (returnCode < 0) 
    {
        string error = "Could not start JVM: ";
        error += getErrorMessage(returnCode);
        LOG("error starting JVM: " << error);
        throw EXCEPTION(error.c_str());
    }
    else
    {
        LOG("JVM started");
    }
JavaVMInitArgs vm_args;
JavaVMOption选项[1];
选项[0]。选项字符串=“-Djava.compiler=NONE”;
vm_args.version=JNI_version_1_2;
vm_args.options=选项;
vm_args.nOptions=1;
vm_args.ignoreunrecogned=JNI_TRUE;
日志(“启动JVM”);
jint returnCode=JNI_CreateJavaVMptr(&jvm,(void**)&env和vm_参数);
如果(返回代码<0)
{
string error=“无法启动JVM:”;
错误+=getErrorMessage(返回代码);

日志(“启动JVM时出错:”启动进程时,进程中有多少可用虚拟内存?是32位还是64位?为什么要禁用JIT,这通常只用于调试JVM中非常特殊的IIFC问题?很抱歉延迟,但在添加日志记录后,我花了这么长时间再次复制错误。下面是失败前的内存统计:2016-01-20 13:14:25.969启动JVM 2016-01-20 13:14:25.969[8388]%使用内存:26 2016-01-20 13:14:25.969[8388]物理内存总KB:16677860 2016-01-20 13:14:25.969[8388]物理内存可用KB:12287624 2016-01-20 13:14:25.969[8388]分页文件总KB:19168228 2016-01-20 13:14:25.969[8388]分页文件的可用KB:13251052 2016-01-20 13:14:25.969[8388]虚拟内存的总KB:2097024 2016-01-20 13:14:25.969[8388]虚拟内存的可用KB:1455608 2016-01-20 13:14:25.976[8388]启动JVM时出错:无法启动JVM:-4 JNI_ENOMEM:内存不足这是在64位Windows 8.1上运行的32位Excel和ocx。我不确定为什么禁用JIT。我继承了它,并且在获得它时它就在那里。我会给原始开发人员发电子邮件,看看他是否记得。另一个注意事项:成功运行的内存统计是虚拟的当它失败时,与上面显示的统计数据完全相同。