一、JVM概念

Java虚拟机:Java Virtual Machine(JVM)是一个抽象的计算模型,相对于实体计算机,它是一个虚拟的环境,有自己的指令集和执行引擎,可以在运行时操控内存区域。

目的:为在JVM之上运行的应用程序,提供一个运行环境。可以开发自己的JVM。

 

二、类文件格式

1. JVM不关心编程语言的语法,而是关注类文件*.class,类文件*.class与Java面向对象中的类结构没有关系

2. *.java文件->编译器->*.class类文件,包含字节码->JVM执行->底层平台执行(OS和硬件)

 

三、JVM vs C/C++

1. Java编译器是半编译,只编译为类文件;C/C++编译器会直接编译成二进制文件

2. Java不需要改代码,编译一次就在不同平台上执行;C/C++在不同平台上,需要被平台的编译器重新编译

3. 虽然Java编译器生成的类文件是平台无关的,但是JVM是与特定平台相关的,每个平台有自己的JVM

 

四、JVM vs JRE vs JDK

1. JRE:Java Runtime Environment,Java运行的标准环境,是JVM的一个实现,每一个在JRE上运行的java程序都会创建一个JVM实例,通过类加载器加载到运行环境中

2. JDK:Java Develop Kit,Java开发的最小环境,包含JRE,也就是开发环境要包含运行环境

 

五、类加载器Class Loader加载过程

1. 加载含有字节码的类文件和标准Java类文件,标准Java类文件位于/jre/lib目录下

2. 扩展机制定位扩展的类库,扩展类位于/jre/lib/ext目录下

3. 如果要加载的类没有在标准类库和扩展类里,加载器会搜索CLASSPATH环境变量下定义的文件路径

 

六、内存分类

1. 堆Heap:用于存储动态或临时分配的内存空间,类和数组是在堆里创建的,当超出堆的可用内存空间时,会引发GC

2. 栈Stack: 用于存储局部变量和方法调用的临时结果,每一次方法调用会创建一个栈

3. 方法区:JVM线程间的共享存储区

4. 寄存器:用于执行字节码指令

 

七、JVM功能

1. 加载:通过类加载器加载类文件

2. 链接:链接类文件,交给JVM运行时执行

3. 初始化:分配内存和调用构造方法设置初始值