实用指南:JVM篇:一文读懂JVM:工作原理之核心技术解析
引言
本文将从类的生命周期、类加载机制、JVM的内存区域、对象的创建过程、对象的内存分配方式、垃圾标记算法、垃圾回收算法、垃圾回收器等专题逐一为大家深入浅出探究JVM工作原理。
简单来讲,我们程序员写好一份java档案,然后由java编译器编译成class文件,该class档案就存在磁盘当中了,JVM需要将这个文档从磁盘上加载到JVM的内存当中以待采用,当我们发出一个new的指令时,JVM就会从内存当中去找这个对象的类元信息,然后根据这个类元信息创建对象,并且将这个对象放在JVM内存当中以待运用…等到采用完毕,就会将这个对象回收。
上述呢是一个整体的思路,围绕这个思路,大家接下来进入正题…
- 类的生命周期
加载、连接、初始化(用到的时候才会初始化)、应用、卸载。
连接分为验证、准备、解析。
加载:从磁盘到JVM内存。
准备:初始化静态变量,比如int初始化0、boolean初始化false、静态对象初始化null,为静态变量设置初始值隐式赋值
解析:字符引用解析成内存直接引用。
字符引用:编译阶段生成的间接引用,经过类全限定名、字段名、方式名等符号描述目标位置(类全限定名)。
直接引用:运行时生成的指向目标内存地址的引用
初始化:静态变量显式赋值
2)类加载机制
启动类加载器,BootStrup ClassLoader:负责加载JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等。
扩展类加载器,Ext ClassLoader:负责加载JVM运行的位于JRE的lib目录下的ext扩展目录中的jar类包。
应用类加载器,App ClassLoader:负责加载ClassPath路径下的类包
自定义加载器:负责加载用户自定义路径下的类包。
双亲委派机制:只有父加载器反馈无法完成加载请求时,子加载器才会尝试自己去加载。
工作原理:
① 当Java程序需要加载一个类时,开始校验是否已被自己加载,如没有则会委托给当前类加载器的父类加载器进行加载。
② 父类加载器会按照相同的方式尝试加载该类。如果父类加载器能够成功加载该类,则加载过程结束。
③ 如果父类加载器无法加载该类,则会将加载请求再次委托给它的父类加载器,直到达到顶层的引导类加载器。
④ 引导类加载器是Java虚拟机内置的类加载器,它负责加载核心类库,如java.lang包下的类。
⑤ 如果引导类加载器也无法加载该类,则会回到初始的类加载器,尝试启用自身的加载机制加载该类。
⑥ 如果自身的加载机制仍然无法加载该类,则会抛出ClassNotFoundException异常。
作用:避免类的重复加载,保证唯一性,沙箱安全机制,确保核心类库的安全,防止恶意代码替换核心类库。
优点:遵循单一职责原则,不同的类加载器加载不同的类。
JVM类加载机制详细:从JDK源码级别深度解析JVM类加载机制
打破双亲委派机制
tomcat多个应用。需打破双亲委派机制。
自定义类加载器,继承classloader,重写findClass,复用loadclass方法。
如何打破双亲机制?
借助自定义类加载器,继承classloader,重写loadclass办法,非自己包下面的类则由父加载器去加载,加载自己的包下面的类。
JDK9 扩展类加载器变成平台类加载器。
优化:将类规划到各个模块之中,在委派给父加载器之前,
浙公网安备 33010602011771号