将C#与C集成到Java时OutOfMemoryError / Program崩溃

时间:2012-06-28 03:01:38

标签: c# java c windows java-native-interface

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

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

开发平台是Windows 7 64位操作系统。 酷睿i7,8GB内存 实际程序必须为32位,以便向后兼容旧硬件/操作系统。

根据我的理解,32位进程通常最多可以使用2 GB的地址空间。从我的驱动程序占用的任务管理器获取的峰值总大小为256MB。供应商的C#程序加载了很多其他库,但我非常怀疑它们会占用超过700MB。

这可能是什么问题?是地址空间不连续吗?但如果是这种情况,为什么JRockit会彻底崩溃,因为它可以处理非连续的地址空间?

1 个答案:

答案 0 :(得分:4)

这里有太多可能出错的事情来推测它可能是哪一个。

一些建议:

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

  • 随机更改变量(比如尝试不同的JVM)是​​一种糟糕的方法,除非你有一些证据证明这是问题......在你的情况下。

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

  • 您需要重现客户端看到的实际问题。掌握他们的程序以及硬件和操作系统等的详细信息,并尝试设置克隆。如果无法做到这一点,请安排实地考察,直接访问他们的工具包。

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