导图社区 jvm类加载机制思维导图
这是一篇关于jvm类加载机制思维导图,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
这是一篇关于对象生命周期的思维导图,包括生命周期,引用类型,垃圾回收等方面内容,可供大家学习以及参考。
这是一篇关于JVM内存模型的思维导图,JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
jvm类加载机制
定义
类加载:将类的字节码文件所包含的数据读入内存,最终目的提供数据访问入口的机制,称为类加载机制
java文件 --> class二进制文件 -->加载进内存 -->数据访问接口(Class对象)
加载类的场景
本地系统直接加载
网络下载.class资源
zip,jar归档文件中加载.class资源
专有数据库中提取.class资源
java源文件动态编译为.class文件资源
重点加载流程
装载
通过类的权限定名获取定义此类的二进制字节流--类加载器
讲字节流代表的静态存储结构转化为方法区的运行时数据结构
在堆中生成Class对象,作为数据访问入口
完成装载后,运行时数据区的方法区和堆内存中已经有数据了
方法区:类信息、静态变量、常量
堆:代表被加载类的Class对象
链接
验证
准则:符合规范要求、不会危害虚拟机安全
文件格式验证
元数据验证
字节码验证
符号引用验证
通过参数设置 -Xverify:none 取消验证
准备
为类变量(静态变量)分配内存,且设置该类变量的默认初始值,如:int = 0
不包含 final 和static 同时修饰的变量,因为final修饰的在编译阶段就会分配了,准备阶段会显示初始化
没static修饰的变量不会被初始化,这个是实例变量,不是类变量,实例变量会随着对象一起分配到堆中
静态变量的赋值是在构造阶段处理的。所以在构造前一直是分配默认值
实际情况只有被 final 和 static 同时修饰的变量,在准备阶段,通过ContstantValue被显示赋值,其余均在 构造器中初始化赋值,且通过ContstantValue被显示赋值仅支持基础类型和字符串,因为基础类型和字符串在编译期就放入常量池中了。(有疑问,编译不就是生成二进制的class文件吗)
解析
将常量池内的符号引用转换为直接引用
缓存
虚拟机对第一次解析结果进行缓存,来避免重复解析
初始化
初始化阶段是执行类的构造器方法的过程
理解:准备阶段 类变量通过一次系统要求的初始化,初始化阶段则根据程序定制直观计划去初始化变量和资源。
java中对类变量初始化设值方式有两种
声明类变量是指定初始化
使用静态代码块为类变量初始值
所有 要注意代码顺序,定义在代码块前
初始化步骤
假如类还没被加载和链接,程序线加载类并链接该类
假如类的直接父类没初始化,则Ian初始化其父类
假如类中有初始化语句,则系统依次执行
场景分类,主动引用和被动引用
类加载器
功能 字节码转Class对象,还能判断唯一性,通过ConcurrentHashMap
Bootstrap ClassLoader
加载 rt.jar
c++实现,不是ClassLoader子类
Extension ClassLoader
jre/lib中其余jar包,或者-Djava.ext.dirs指定目录下的jar包
App ClassLoader
classpath中的jar包和类和-Djava.class.path 指定目录下的jar包和类
Custom ClassLoader
自定义加载器,如 tomcat和jboss都有自己的ClassLoader
分层保障 核心API的安全。
类加载机制
全盘负责
双亲委派(代码能理解是在如何实现的,包括缓存)
缓存机制
打破双亲委派行为不可取,非深入研究慎用