一、初识JVM
1、jvm执行.class的顺序
1、.java文件经过编译生成.class文件
2、.class文件经过加载(加载、连接、初始化)进入运行时数据区
a、使用加载器通过流的方式加载到内存空间。
b、对数据进行检查、准备(变量加载默认值等)、解析
c、初始化数据
3、运行时数据区: 本地方法栈、虚拟机栈、程序计数器、方法区、堆空间
4、执行引擎、本地库接口
2、类装载系统
1、组成:加载、链接、初始化
2、①加载:引导类加载器 -> BootStrapClassLoader
自定义加载器 -> 间接继承ClassLoader的加载器(包含:ExtensionClassLoader(扩展类加载器)、ApplicationClassLoader)
②BootStrapClassLoader加载器:负责加载java核心类(Launcher.getBootstrapClassPath()可以获取他负责的包)
③ExtensionClassLoader: 负责jre/lib/ext下的类
④ApplicationClassLoader负责我们应用的类
3、①链接:验证、准备、解析
②验证:每一个.class文件都会有一个魔法值,16进制为CAFEBABE(咖啡宝贝)
3、运行时数据区
1、组成:PC计数器,本地方法栈,jvm栈,堆,方法区
2、PC计数器:记录各个栈帧运行的位置;不存在GC、不存在OOM
3、本地方法栈:使用C语言编写的方法;不存在GC,会出现栈溢出异常
4、jvm栈:所有非本地方法运行的地方,每一个运行方法对应一个栈帧;不存在GC,会出现栈溢出异常(StackOverFlowError)
5、堆:JDK1.8后在hotspot虚拟机中所有对象、常量池、静态变量等都存在堆中
6、方法区:及存放类、方法等的地方,JDK1.8又称元空间
4、执行引擎
1、执行引擎:在JDK1.8中使用的有解释器、即时编译器(JIT)
2、解释器优点是及时性,缺点是速度慢
即时编译器的优点是速度快,却点是第一次编译耗时长