2016-03-02 72 views
1

我嘗試使用Java中的JNA集成DLL。 DLL分配大量內存(〜600MB)。 庫被編譯爲32位版本,所以我需要使用32位JVM。在Java中調用的dll中分配內存錯誤JNA

我有嚴重錯誤,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 

應用程序啓動時使用參數

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

可能問題是在JVM上有一些內存限制(庫很適合C#)。也許有人有類似的問題,並可以幫助我找到解決方案如何在32位JVM中運行此庫。

+0

您的'new []'運算符請求的內存數量很可能過大,並且沒有人在等待異常。 – technomage

回答

1

32位應用程序通常限制爲2GB的虛擬地址空間。假設你在一個64位的Windows上,如果這個二進制文件是用largeaddressaware標誌構建的,那麼這個擴展可以擴展到4GB。我認爲32位java.exe沒有,雖然我沒有自己測試過。

因此,如果JVM已經在堆吃了1.3G,爲線程堆棧和其他非堆數據結構提供了額外的內存,那麼dll就沒有剩餘空間進行分配。如果它需要進行大量的連續分配,這可能會失敗並拋出一個C++異常。

你的選擇可能是:

  • 減少堆大小
  • 獲得該庫的64位版本,而不是
  • 看是否標誌着二進制爲LARGEADDRESSAWARE幫助,也有工具來做到這一點
+0

將最大堆大小減少到900m'-Xmx900m'對我的情況有所幫助。謝謝。 – wonsz