2012-06-28 57 views
1

Ok當我編寫了C#驅動程序(驅動程序如虛擬程序來調用存根而不是設備驅動程序)程序調用C封裝器DLL和C封裝器DLL調用通過JNI實現大部分工作的java jar文件。所有3個程序都是32位。這樣做是爲了與另一個應該執行C#的供應商以及調用我們的C DLL的C程序集成。OutOfMemoryError/Program C++ to C to Java

我的示例測試C#到C到Java程序工作正常,但問題是,當供應商的實際C#程序調用我們的程序時,熱點JVM無法初始化完全或如果它正確初始化,在調用我們函數,它會拋出OutOfMemory錯誤。當我嘗試使用不需要連續堆空間的JRockit JVM時,JVM會導致程序崩潰。

開發平臺是Windows 7 64位操作系統。 Core i7,8GB RAM 實際程序必須是32位才能向後兼容舊硬件/ OS。

從我的理解來看,一個32位的進程通常有高達2GB的可用地址空間。從我的驅動程序佔用的任務管理器獲取的最大總大小爲256MB。供應商的C#程序加載了很多其他庫,但我非常懷疑它們會佔用700MB以上的空間。

這裏有什麼問題?地址空間是不是連續的?但是如果是這樣的話,爲什麼JRockit會崩潰,因爲它可以處理非連續的地址空間?

+1

這聽起來像一個瘋狂的設計;)這不是一個軍事項目,是嗎?)? – paulsm4

+0

使用熱點JVM時 - 您得到的初始化錯誤是什麼? – Deco

+0

256-700 MB內存的驅動程序? [WAT](http://www.moneyandshit.com/wp-content/uploads/2011/04/wat.jpg)。你碰巧爲微軟工作嗎? – Kevin

回答

4

有太多的事情可能會出錯,在這裏推測它可能是哪一個。

建議的某些位:

  • 這是一個壞主意,試圖通過獨立於實際證據的開發理論調試問題。你有一個理論認爲這是與非連續的地址空間有關的,(顯然)沒有任何真實的證據。先獲得一些證據...

  • 隨機變化的變量(如嘗試不同的JVM)是​​一種不好的方法,除非你有一些證據表明這是問題...在你的情況。

  • 如果您正在構建在32位平臺和傳統操作系統上運行的東西,則需要32位+傳統OS測試環境來進行日常開發測試。 (您的問題的措辭表明您沒有。)

  • 您需要重現客戶端正在看到的實際問題。抓住他們的程序和他們的硬件和操作系統等細節,並嘗試建立一個克隆。如果這是不可能的,安排現場參觀,您可以直接訪問他們的工具包。

最後。一個試圖在同一個過程中拼湊C,C#和Java的系統設計對於瘋狂的程度在技術上是有風險的。誰決定這是一個好主意需要重新教育。

+0

該軟件必須在最新的操作系統上運行,並且可以向後兼容較舊的操作系統,因此開發測試 – shawn

+0

如果我得到OutOfMemory或堆大小錯誤,您的理由是什麼? – shawn

+0

@shawn - 1)我沒有說你應該停止測試最新的平臺。 2)我不會猜測。你應該*重現*問題... –