【问题标题】:Totally Confused with java.exe完全与 java.exe 混淆
【发布时间】:2014-09-24 15:30:11
【问题描述】:

JDK 是 JRE 的超集。 JDK 具有必要的工具,如 javac java.exe 调试器等 + JRE。 但是 JRE 有一个特定的 JVM 实现。

我的假设是 java.exe 或 java 应用程序启动器是解释器(如果我错了,请纠正我)。 此外,JVM 也进行解释。

最后解释器是 JVM 的一部分还是 JDK 工具的一部分?请解释一下。

【问题讨论】:

  • 我的问题不是 b/w JDK、JRE 等的区别。我的疑问是,如果我的系统中只有 JRE,JVM 如何使用实际上是JDK 工具的一部分。
  • @karthik4621 JRE JVM(还有更多)。它字节码解释器。

标签: java jvm


【解决方案1】:

java.exe 既不是 JVM 也不是解释器。它是一个启动器 - 一个通常用 C 编写的小程序,它执行以下操作:

  1. 找到已安装的 JRE
  2. 加载 JVM 动态库 (jvm.dll)
  3. 使用Invocation API 创建一个新的 Java 虚拟机
  4. 找到主类并使用JNI调用main()方法

JRE 大致包括

  1. JVM - jvm.dll
  2. 类库 - rt.jar
  3. 本机库 - 类库和操作系统平台之间的层,例如java.dllnet.dllnio.dllawt.dll
  4. 资源 - 字体、属性、字符串等

现在,字节码解释器、字节码验证器、类加载器、JIT 编译器、垃圾收集器和许多其他很酷的东西 - 都是 Java 虚拟机的组成部分。

【讨论】:

  • 非常感谢您的解释
  • 谢谢。你能给出ELF文件java的Linux版本解释吗?是不是和windows版基本一样,把你回复里的.dll换成.so
  • 所有线程(在运行java 命令以运行已编译的Java 程序时隐式创建的)是否都执行Java 虚拟机?还是只是一些线程? stackoverflow.com/questions/55666827/…
  • @Tim 是的,Linux 上也是如此。
  • JVM 创建的所有线程都在运行 Java 虚拟机代码。有时它是本机代码(例如,用于编译器线程和 GC 线程),有时它是 Java 代码。
【解决方案2】:

@karthik4621 java.exe/javaw 应用程序是 JRE 的一部分 查看 JRE 安装目录以找到 bin 文件夹,找到可执行文件和与 JDK 捆绑在一起的 java.exe 也是相同的 :)我建议您阅读 oracle 文档以及快速浏览 JDK/JRE 安装位置内容的问题 –

【讨论】:

  • 尝试使用 JRE 的 bin 目录中可用的 java.exe 来解释字节码(任何每次编译的 .class 文件以了解差异并确保删除指向 java.exe 的路径环境变量在JDK安装位置)
【解决方案3】:

你说得对,java.exe 是 JVM(java 虚拟机)的解释器,而 JVM 是通过与底层操作系统通信来执行代码的地方

【讨论】:

  • 它在解释什么?
  • 但是我的问题是,如果我的系统中只有 JRE,JVM 如何使用解释器,它实际上是 JDK 工具的一部分。
  • @karthik4621 java.exe/javaw 应用程序是 JRE 的一部分 查看 JRE 安装目录找到 bin 文件夹,找到可执行文件和与 JDK 捆绑在一起的 java.exe 也是相同的: ) 为了更深入地了解这个问题,我建议您阅读 oracle 文档以及快速了解 JDK/JRE 安装位置的内容
猜你喜欢
  • 2014-09-13
  • 2021-12-14
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2016-09-08
  • 2014-07-09
相关资源
最近更新 更多