我有点困惑,JVM是代表字节码(生成它)还是只是加载已编译的.class文件(字节码)到内存中?或者JVM只是规范,以平台无关的方式运行字节码!非常感谢。
我有点困惑,JVM是代表字节码(生成它)还是只是加载已编译的.class文件(字节码)到内存中?或者JVM只是规范,以平台无关的方式运行字节码!非常感谢。
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语言始终是平台无关的。
javac file
时,Java编译器(称为javac)会将你的代码转换为中间形式(字节码)。它不直接转换为特定于平台的机器语言,因此你可以将类文件(字节码)提供给任何平台上的任何人。这就是“一次编写,到处运行”的工作原理。它不是编译成特定于平台的机器语言,而是编译成通用字节码。java file
时,JVM会在运行时“即时”将字节码分块转换为本机机器语言并执行。它使用JIT编译器进行此操作(可能会产生混淆,因为这与javac不同)。顺便说一下,JDK不同于javac。 JDK是包含Java中的所有内容(包括JVM和javac)的SDK(软件开发工具包)。对于Java,它有一个专门的编译器叫做Javac。Javac将您的Java代码编译成字节码。然后我们有JVM使用该字节码。
输入图像描述现在有一个内置工具可用,称为Java Visual VM(JDK版本6、更新7之后),您将在bin中找到该工具,即javac.exe存在的目录。只需打开此工具,它将监视使用JVM(分析器)的进程。如果您在打开Visual VM时执行它,它将显示javac、eclipse等作为在JVM上运行的Java进程。
Jdk 会为扩展名为 .java 的文件生成字节码。 JVM 将字节码转换为机器语言,然后执行它。