1

好的,所以我编写了一个 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 位操作系统。Core i7, 8GB RAM 实际程序必须是 32 位才能向后兼容旧硬件/操作系统。

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

这里可能是什么问题?是不是地址空间不连续?但如果是这样的话,为什么 JRockit 可以处理不连续的地址空间而直接崩溃呢?

4

1 回答 1

4

这里有太多可能出错的事情,无法推测可能是哪一个。

一些建议:

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

  • 随机更改变量(例如尝试不同的 JVM)是​​一种不好的方法,除非您有一些证据表明这是问题所在……在您的情况下。

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

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

最后。试图在同一个过程中将 C、C# 和 Java 拼凑在一起的系统设计在技术上是非常危险的。无论谁认为这是一个好主意,都需要接受再教育。

于 2012-06-28T03:32:36.300 回答