我在这里有点困惑,JVM 代表字节码(生成它)还是它只是将编译的 .class 文件(字节码)加载到内存中?!或者 JVM 只是以独立于平台的方式运行字节码的规范?!非常感谢。
最佳答案
- JVM = JIT 编译器 + Java 解释器 + 垃圾收集器
- JRE = JVM + 库类
- 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/