我正在开发一个托管在 Parallel Plesk Panel (Windows) 上的 .NET 网站,我有一些用 Java 编写的类,使用它的 swing 和 JavaMail API,我想在我的网站中使用它们。我有两个选择 - jni4net 和 IKVM.net。只是想知道在性能和开发努力方面哪一种是高效便捷的方法?
1 回答
jni4net更小(二进制大小为 1.5MB),并且占用空间更大——但开发可能会停止并且项目已被放弃,因为最后一次存储库更新是在 2013 年 11 月执行的,但它仍然是处于Alpha阶段,因此不成熟,复杂,需要做更多的工作才能使用它,顺便说一句,jni4net使用的是LGPL,所以如果你想在你的商业产品中使用它会是一个很大的问题。
IKVM.net,AFAIK,几乎是用 CLR 编码的 Java Runtime 的完整实现(因为它实现了 OpenJDK,而不是 Orcale Java,所以它有点坏了)平台,它本身会将Java 字节码编译成 IL,然后执行它,这类似于QEMU,但是还有一个问题,我们遇到了三层,第一层是Java Runtime,然后是CLR,最后是native code,因此非常非常慢,而且另一个问题是初始时间问题。
例如,我写了一个 Java 程序,它只会打印著名的“Hello World”引用然后退出,然后我想测试 IKVM.net 和 Orcale JVM(缩短为 JVM)可以做多少毫秒(我在具有 2 个通用 3.4 GHz CPU 和 2G DDR3 内存的 KVM windows 环境中运行这两个平台),我的结果是,JVM 在 692ms 内完成,内存使用量为 9MB,而IKVM.net,可以使用大约 4923 毫秒和 19MB 的内存占用来打印一个很酷的“Hello World!” 只报价!如果我将 Java 类编译成预编译的 IL(ikvmc),可以将时间减少到大约 1907 毫秒,并且内存使用与 JIT 相同。
相比之下,对于 JVM 和 IKVM.net(JIT),JVM 在时间上领先对手约 7 倍,在内存上领先 2 倍,而对于 JVM 和 IKVM.net(预编译),JVM 仍然领先约2.7 倍和 1.11 倍的内存与竞争对手相比,而对于 IKVM.net(JIT) 和 IKVM.net(预编译),它会给你带来双倍的时间提升,并且内存占用没有差异,尽管它们仍然比 JVM 更慢更胖。
还有另一个问题,预编译的 IKVM.net 存根必须在任何地方都携带整个 IKVM.net 二进制文件,然后一个包的大小增加了大约 41MB,我不知道我是否可以剥离一些未使用的库,但在大多数情况下,我们不会那样做。
对于 jni4net,打印“Hello World”的时间大约是 1567ms,从 CLR 到 JVM,从 JVM 到 CLR 呢?有点奇怪,它使用了 2106ms,我不知道为什么差异很大,可能是因为Java 是动态从头开始创建 CLR 实例,而CLR 可以直接 P/Invoke 静态中的 JNI。
总而言之,jni4net 更可能是CLR 和 JVM 之间的代理——它没有实现完整的 Java 环境,也没有模拟完整的 CLR,而是通过现有资源创建 JVM 和 CLR 实例。虽然IKVM.net,它更像是一个伪装成.Net的JVM,但是你可以将Java代码注入CLR,而你不能在Java端编写.Net,它很慢,但它不再需要JVM了,您可以只安装 .Net Framework 并享受其余部分(但您只能运行 Java SE)。
为了回答你的问题,根本没有好的解决方案——jni4net 和 IKVM.net,实际上是两个完全不同的东西,但如果你想强行得出结论,我想使用 IKVM.net——它仍然是活跃的、强大的、可扩展的,但又胖又慢。