1)基本概念
JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。
Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
2)java代码的执行
使用javac 命令,通过编译器将java源文件编译为.class字节码文件文件;字节码文件通过解释器,编译成特定机器上的机器码。
Java源文件-->编译器-->字节码文件
字节码文件-->JVM-->机器码
每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了
3)内存管理
- 方法区
- 堆
- 方法栈
- PC寄存器
4)JVM内存分类
- 私有区域:生命周期与线程生命周期相同
- 程序计数器:一块较小的内存空间,当前线程所执行的字节码的行号指示器,每条线程都需要独立的程序计数器
- 虚拟机栈:java方法执行的内存模型,每个方法执行的同事都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法调用-->执行完成==入栈-->出栈
- 本地方法区:和Java Stack作用类似,虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务
- 线程共享区域:随虚拟机的启动/关闭,而创建/销毁
- JAVA堆:线程共享的内存区域,创建的对象和数组保存在堆内存中,是GC进行垃圾收集的最重要内存区域。VM采用分带收集算法,所以java堆还可以分为,新生代和老年代
- 方法区:也称永久代,用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码,使用Java堆的永久代来实现方法区。运行时常量池是方法区的一部分。
5)JVM运行时内存(从GC角度&#