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

6

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


2
JDK使用编译器(javac)生成字节码,JVM运行它。 - BackSlash
9个回答

12
  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编译器和Java解释器将字节码转换为相应的机器码。

针对不同操作系统,Oracle Corporation提供了不同的JDK和JRE软件。因此,JVM(属于JRE)和javac编译器(属于JDK)都是平台相关的。因此可以确认,javac编译器和JVM并非用Java编写的。因为Java语言始终是平台无关的。


1
我认为这个答案是对问题的精确回应。 - divine

7
Java编译器(javac)将您的可读代码转换为字节码,然后在JVM中运行。
根据Oracle文档
程序必须转换为Java VM可以理解的形式,以便任何具有Java VM的计算机都可以解释和运行程序。编译Java程序意味着将程序文件中(也称为源代码)的可读文本转换为字节码,这是Java VM的独立于平台的指令。

4
当你说javac file时,Java编译器(称为javac)会将你的代码转换为中间形式(字节码)。它不直接转换为特定于平台的机器语言,因此你可以将类文件(字节码)提供给任何平台上的任何人。这就是“一次编写,到处运行”的工作原理。它不是编译成特定于平台的机器语言,而是编译成通用字节码。
当你说java file时,JVM会在运行时“即时”将字节码分块转换为本机机器语言并执行。它使用JIT编译器进行此操作(可能会产生混淆,因为这与javac不同)。顺便说一下,JDK不同于javac。 JDK是包含Java中的所有内容(包括JVM和javac)的SDK(软件开发工具包)。

1
JVM 运行字节码,Java 编译器 生成它。
然而,应用程序可以在运行时 生成字节码,但生成的字节码再次由 JVM 执行。

1
根据平台不同,JVM会将字节码转换为机器码。更准确地说,JVM内部的即时编译器(JIT)会完成这个过程。字节码是由javac.exe生成的。然后,java.exe在Windows系统中借助jvm.dll将字节码转换为机器码。

2
小细节:JIT编译器通常生成机器代码,而不是汇编代码。汇编代码是(非常接近)机器代码的文本表示形式。 - Martin Törnwall

0
JDK(javac)生成字节码(.class 文件)。现在,任何平台上的 JVM 都可以运行这个字节码。

0
简而言之,Java虚拟机运行/解释/将字节码转换为本地机器代码。它不生成字节码。我们可以将JVM视为解释器。
以下内容将有助于理解上述内容,
字节码,也称为可移植代码或p-code,是一种指令集,旨在通过软件解释器进行高效执行。它介于人类可读源代码和机器可读机器代码之间。字节码程序可以通过逐个解析和直接执行指令来执行。这种字节码解释器非常便携。一些系统称为动态翻译器或即时(JIT)编译器,在运行时根据需要将字节码转换为机器代码。这使得虚拟机具有硬件特定性,但不会失去字节码的可移植性。请参阅this
编译器是一种计算机软件,将用一种编程语言(源语言)编写的计算机代码转换为另一种编程语言(目标语言)。Java编译器是Java编程语言的编译器。最常见的Java编译器输出形式是包含平台中立Java字节码的Java类文件。

对于Java,它有一个专门的编译器叫做Javac。Javac将您的Java代码编译成字节码。然后我们有JVM使用该字节码


0

输入图像描述现在有一个内置工具可用,称为Java Visual VM(JDK版本6、更新7之后),您将在bin中找到该工具,即javac.exe存在的目录。只需打开此工具,它将监视使用JVM(分析器)的进程。如果您在打开Visual VM时执行它,它将显示javac、eclipse等作为在JVM上运行的Java进程。


0

Jdk 会为扩展名为 .java 的文件生成字节码。 JVM 将字节码转换为机器语言,然后执行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接