gpt4 book ai didi

java - Java JNA调用的dll中分配内存错误

转载 作者:行者123 更新时间:2023-11-30 07:33:19 29 4
gpt4 key购买 nike

我尝试在Java中使用JNA集成DLL。 DLL 分配大量内存(~600MB)。库被编译为32位版本,所以我需要使用32位JVM。

我收到来自 JVM 的 fatal error

 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

应用程序使用参数启动

-Xmx1300m -Xms1300m -Xss10m -XX:MaxDirectMemorySize=3g -XX:+PrintHeapAtGC

问题可能是 JVM 上的一些内存限制(库与 C# 配合得很好)。也许有人有类似的问题,可以帮助我找到如何在 32 位 JVM 中运行这个库的解决方案。

最佳答案

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

因此,如果 JVM 已经为堆占用了 1.3G、用于线程堆栈和其他非堆数据结构的额外内存,那么留给 dll 进行分配的空间就很小了。如果随后需要进行大量连续分配,则可能会失败并引发 C++ 异常。

您的选择可能是:

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

关于java - Java JNA调用的dll中分配内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35750979/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com