Java程序和JVM生成的exe

时间:2011-10-16 15:31:26

标签: java jvm

Java与平台无关,因为它使用平台相关的JVM来启动Java程序。 JVM了解字节代码并执行程序。我知道做这个的旧方法是翻译。但现在JVM正在使用JIT。但我并没有清楚地理解JIT概念。我认为,jVM可以将字节代码转换为exe(对于Windows),之后我可以在没有JVM的情况下运行这个已翻译的程序。但是我可以在.net JIT中看到生成的exe,但我看不到Java中生成的exe。

  1. 我该怎么做(从Java创建本机exe文件)?
  2. JVM生成的exe与同一个C应用程序的性能如何?
  3. Java如何处理静态链接和动态链接?

4 个答案:

答案 0 :(得分:4)

一些想法:

  1. 您不能仅使用核心Java生成exe,而JVM肯定不会这样做。它仍然在JVM中运行字节代码。这里运行的实际exe是java.exe。
  2. 很难说自从JIT生成相当快的代码以来exe是否会明显加快。
  3. Java不会创建dll,如果这就是你的意思,但它可以通过JNI和JNA与格式良好的dll(不是.Net dll)进行交互。如果您想与.Net库进行交互,我认为您需要使用其他路由,例如套接字或COM接口。
  4. 另外,存在从java类创建exe的程序,但是大多数创建仍然需要JVM的文件,而不是我相信的好文件不是免费的。

答案 1 :(得分:2)

  1. 这样做没有多大意义。
  2. 有时更快,有时更慢。
  3. 不知道。

答案 2 :(得分:1)

  

我认为,jVM可以将字节代码转换为exe(对于Windows),之后我可以运行这个没有JVM的翻译程序。

这不正确。

实际上,Hotspot JIT编译器通过将各个方法编译为正在运行的JRE中的本机代码来工作。他们通常只是在调用方法几次后才开始编译方法,以便在典型的执行路径上收集统计信息。 Hotspot JIT编译器不会产生“exe”。

  

1)我该怎么做(从Java创建一个本机exe文件)?

有第三方应用程序可以执行此操作。但是,通过这样做,您将失去JIT编译的许多优点,例如优化当前程序运行的执行模式。

  

2)JVM生成的exe与同一个C应用程序的性能是什么?

这取决于应用程序。

  

3)Java如何处理静态链接和动态链接?

Java无法解决此问题。它取决于您用于创建可执行文件的第三方应用程序。


我建议不要走这条路。如果将代码分发为“.exe”文件至关重要,则可能不应该使用Java。

答案 3 :(得分:0)

  

我该怎么做(从Java创建本机exe文件)?

有一种常见的误解,认为这在某种程度上会更好。但是,我没有看到它的好情况。像Excelsior JET这样的产品可以编译二进制文件。 GCC可以为Java 1.4编译二进制文件,但这不是当前的项目AFAIK。

  

JVM生成的exe与同一个C应用程序的性能如何?

你无法比较这两者。如果你想要一个面向对象的程序,你不能轻易地用C语言编写它,如果不运行它几乎肯定会慢得多。如果要编写C风格的程序,请用C语言编写。

  

Java如何处理静态链接和动态链接?

JVM进行动态后期链接。事实上,当您加载和卸载类加载器时,它可以多次链接和重新链接代码。