JVM内部是如何工作的?
首先,编译下java源文件:
javac MyFirstJavaProgram.java
-----------------------------MyFirstJavaProgram.java-------------------------------------
public class MyFirstJavaProgram {
public static void main(String []args) {
System.out.println("Hello World");
}
}
-----------------------------MyFirstJavaProgram.java-------------------------------------
然后,执行下:
java MyFirstJavaProgram
这个过程中,java这个程序去找MyFirstJavaProgram.class这个文件,这个文件是源文件编译后的字节码,怎样查看字节码?
输入javap -c MyFirstJavaProgram.class得到下面内容:
Compiled from "MyFirstJavaProgram.java"
public class MyFirstJavaProgram {
public MyFirstJavaProgram();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
找到这个字节码文件,把字节码扔给JVM(Java虚拟机),然后JVM解释成一系列计算机指令,最后输出结果。
JVM里面有各种堆、栈、寄存器、方法表和方法数据等,执行过程就是字节码对应JVM底层计算机指令的解析和执行过程(包含类加载器,执行引擎和运行数据区域等)。
参考资料:
1. https://www.quora.com/How-does-JVM-works-internall
2. https://www.artima.com/insidejvm/ed2/jvmP.html
3. https://dzone.com/articles/understanding-jvm-internals