JVM系列(一):Java虚拟机(JVM)概述
一、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. 初始化:分配内存和调用构造方法设置初始值