好的,所以我编写了一个 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 可以处理不连续的地址空间而直接崩溃呢?