将C#与C集成到Java时出现OutOfMemoryError / Program失败

好吧,我写了一个C#驱动程序(驱动程序如虚拟程序调用一个存根,而不是设备驱动程序)调用一个C包装DLL的程序和C包装DLL通过JNI调用一个java jar文件,实际上大部分的工作。 所有3个程序都是32位。 这样做是为了与另一个应该做C#的供应商以及调用我们的C DLL的C程序集成。

我的示例testingC#到C到Java程序工作正常,但问题是,当供应商的实际C#程序调用我们的程序,热点JVM或者初始化完全失败,或者如果它正确初始化,在调用我们的函数,它会抛出OutOfMemory错误。 当我尝试使用不需要连续堆空间的JRockit JVM时,JVM会导致程序崩溃。

开发平台是Windows 7 64位操作系统。 Core i7,8GB RAM实际的程序必须是32位才能向后兼容旧的硬件/操作系统。

据我了解,一个32位的进程通常有高达2GB的地址空间可用。 从我的驱动程序占用的任务pipe理器中获取的最大总大小是256MB。 供应商的C#程序加载了许多其他库,但我非常怀疑他们将占用700MB以上。

这里可能是什么问题? 地址空间是不是连续的? 但是如果是这样的话,为什么JRockit会崩溃,因为它可以处理非连续的地址空间?

在这里可能会出现太多的事情来猜测它可能是哪一个。

一些建议:

  • 试图通过独立于实际证据发展理论来调试问题是一个坏主意。 你有一个理论,这是与非连续的地址空间,(显然)没有任何实际的证据。 首先得到一些证据

  • 随机变化的变量(如尝试一个不同的JVM)是​​一个不好的方法,除非你有证据表明这是个问题。

  • 如果您正在构建在32位平台和传统操作系统上运行的东西,那么您需要一个32位+传统OS测试环境来进行日常开发测试。 (你的问题的措辞表明你没有。)

  • 您需要重现客户正在看到的实际问题。 掌握他们的程序和他们的硬件和操作系统等细节,并尝试建立一个克隆。 如果这是不可能的,安排实地考察,您可以直接访问他们的工具包。

最后。 尝试在同一个过程中拼凑C,C#和Java的系统设计对于疯狂的程度在技术上是有风险的。 谁决定这是一个好主意需要重新教育。