java - JVM 是生成字节码还是运行字节码?

标签 java compiler-construction jvm javac bytecode

我在这里有点困惑,JVM 代表字节码(生成它)还是它只是将编译的 .class 文件(字节码)加载到内存中?!或者 JVM 只是以独立于平台的方式运行字节码的规范?!非常感谢。

最佳答案

  1. JVM = JIT 编译器 + Java 解释器 + 垃圾收集器
  2. JRE = JVM + 库类
  3. JDK = JRE + 开发工具

Sun JVM 是用C 编写的,而Oracle JVM 是用C++ 编写的

Java 编译器 javac 将源代码转换为字节码。 JVM内部的JIT编译器和Java解释器将字节码转换成相应的机器码。

在java中,只有源代码(.java文件)和字节码(.class文件)可用。而且我们不能保存机器代码(.exe 文件),因为.exe 文件只能在运行时形成,并在程序完全执行后立即从 RAM 中消失。

在我们的系统中,javac.exe(用于编译java源代码,例如:javac HelloWorld.java)和java.exe(用于通过JVM执行java字节码,例如:java HelloWorld)都被调用,它们在.仅限 exe 格式(javac.exe 和 java.exe)。 所以 Java 编译器 javac 和 JVM 不是用 Java 编写的。如果它们是用 Java 编写的,那么它们可能以 javac.class 和 java.class 格式提供。

javac 属于 JDK 而不是 JVM。请记住,JVM 仅在运行时工作,这意味着在将源代码编译为字节代码之后..但在此之前,javac 将源代码编译为字节代码。 JVM 通过 JIT Compiler 和 Java Interpreter 将字节码转换成相应的机器码。

针对不同的操作系统,Oracle 公司提供了不同的 JDK 和 JRE 软件;所以JVM(JRE下的)和javac Compiler(JDK下的)都是Platform Dependent。所以可以确认javac Compiler和JVM不是用Java写的。因为Java语言总是Platform Independent。

关于java - JVM 是生成字节码还是运行字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32011039/

相关文章:

java - 日历实例的创建成本特别高

java - 排序并行数组

gcc - 64 位平台上的 ELF 目标文件大小限制是多少?

java - 客户端/服务器 JVM 选项的差异

java - 实例化一个类并在不同的 JVM 中运行它的方法

java - 尝试格式化字符串时出现 IllegalFormatPrecisionException

java - 关闭所有浏览器窗口的方法,无论警报如何 Selenium

.net - .NET/Mono 性能与 JVM 相比如何?

c - 验证解析器中的数据类型/结构

java - Blackberry Screen 类中的 super 构造函数调用