在Java JNA

时间:2016-03-02 15:09:03

标签: java dll jvm jna

我尝试在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中运行这个库。

1 个答案:

答案 0 :(得分:1)

32位应用程序通常限制为2GB的虚拟地址空间。假设您使用的是64位窗口,如果使用largeaddressaware标志构建二进制文件,则可以将其扩展为4GB。我认为32位java.exe没有,虽然我自己没有测试过。

因此,如果JVM已经为堆使用1.3G,为线程堆栈和其他非堆数据结构增加了内存,那么dll进行分配的空间相当小。如果它需要进行大量的连续分配,那么可能会失败并抛出C ++异常。

您的选择可能是:

  • 减少堆大小
  • 获取该库的64位版本
  • 看看将二进制文件标记为largeaddressaware有帮助,有工具可以做到这一点