目录
1.JVM的作用
JVM的作用是为了屏蔽计算机硬件的差异,java源代码通过编译,产生.class字节码文件,不同平台的虚拟机将字节码文件编译成机器能够识别的机器码指令,有了jvm的存在,程序员就不必担心代码对不同平台的适配性问题了.
2.虚拟机的构成
-
类装载子系统:负责将.class文件加载进内存
-
运行时数据区
- 方法区和堆区:被所用线程所共享
- 方法区(jdk7:永久代,jdk8:元空间):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,英文写作Just-In-Time Compiler)编译后的代码等数据。
- 堆区:Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
- 程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
- Java 虚拟机栈(Java Virtual Machine Stacks):线程单独持有,用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
- 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
-
执行引擎:执行引擎的任务就是根据程序计数器的指向将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者.
-
本地方法接口:java调用非java代码的接口
3.java代码的执行流程
java源程序--编译javac-->字节码文件.class-->类装载子系统生成反射类(存入方法区)--->运行时数据区(五大块儿)--->执行引擎-->解释执行+编译执行(JIT)-->操作系统(Win,Linux,Mac JVM)