我尝试在Java中使用JNA集成DLL。 DLL分配了大量内存(~600MB)。 库被编译为32位版本,因此我需要使用32位JVM。
我从JVM那里得到致命错误
EXCEPTION_UNCAUGHT_CXX_EXCEPTION (0xe06d7363) at pc=0x772bd928, pid=7976, tid=2444
详细信息
siginfo: ExceptionCode=0xe06d7363, ExceptionInformation=0x19930520 0x02dce184 0x6a3853d8
和堆叠
Stack: [0x023d0000,0x02dd0000], sp=0x02dce0d0, free space=10232k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [KERNELBASE.dll+0xbd928]
C [MSVCR120D.dll+0x120b86]
C [MSVCR120D.dll+0x12c2a1]
C [face_analysis_libD.dll+0x1157dc] operator new[]+0xc
C [face_analysis_libD.dll+0xea995] Mat<float>::setSize+0xa5
C [face_analysis_libD.dll+0xe904e] Recognizer::initialize+0x9e
C [face_analysis_libD.dll+0xb2bf9] Analyser::initializeAnalyser+0x1c9
应用程序以params
开始-Xmx1300m -Xms1300m -Xss10m -XX:MaxDirectMemorySize=3g -XX:+PrintHeapAtGC
可能问题在于JVM上的一些内存限制(使用C#,库可以很好地工作)。也许有人有类似的问题,可以帮助我找到解决方案如何在32位JVM中运行这个库。
答案 0 :(得分:1)
32位应用程序通常限制为2GB的虚拟地址空间。假设您使用的是64位窗口,如果使用largeaddressaware
标志构建二进制文件,则可以将其扩展为4GB。我认为32位java.exe没有,虽然我自己没有测试过。
因此,如果JVM已经为堆使用1.3G,为线程堆栈和其他非堆数据结构增加了内存,那么dll进行分配的空间相当小。如果它需要进行大量的连续分配,那么可能会失败并抛出C ++异常。
您的选择可能是: