导图社区 JVM
jvm知识点总结,详细的总结了类加载,内存结构。类生命周期,类加载机制,类加载方式,内存结构的栈,堆,方法区。
MySQL——包括数据类型,性能优化,事物,三大特性的知识点内容,适用于java面试的小伙伴~
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
JVM
类加载
类生命周期
加载
验证
验证类的准确性,比如文件格式验证-cafe babe开头,元数据验证符号引用验证等等
准备
类的静态变量分配内存,并初始化成默认值比如代码中static int i = 3,在这个时候会将i初始化为默认值0,int类型默认值为0
解析
符号引用转化为直接引用直接引用是直接指向目标的指针、偏移量等
初始化
为静态变量赋正确的值,比如上面的i会设置成3
使用
卸载
类加载机制
类加载器
启动累加载器
Bootstrap ClassLoader
所有Java.*的代码皆由此加载器加载,为最上层的父类加载器
扩展类加载器
Extension ClassLoader
应用程序加载器
Application ClassLoader
父类委托
先让父类加载器加载,因此先application-> extension->bootstrap 如果父类无法加载才会尝试从自己路径加载类
缓存机制
所有加载过的class都会被缓存,当程序需要使用class时会先从缓存中找缓存中没有才会加载class文件转换成class对象放入缓存所以class文件修改后,重启jvm才能生效
双亲委派机制
当一个类加载器收到加载请求,首先尝试使用父类加载,依次向上直到启动类加载器当父类加载器无法加载时,才尝试自己加载
loadClass 首先从缓存中找,接着从父类找
防止危险代码注入,解决了基础类统一问题
防止内存中出现多份同样的字节码
如何打破
SPI
Service Provider Interface
实现方提供了接口和实现,调用方,调用相应的接口叫API
调用方实现接口 叫SPI
log4j的日志,数据库实现
undefined
自定义类加载器,重写loadClass
类加载方式
jvm加载
反射,class.forName
将class 加载到jvm并可以执行static 块
ClassLoader.loadClass 类加载器加载
将 class文件加载到jvm
内存结构
程序计数器
栈
本地方法栈
虚拟机栈
堆
静态变量
字符串常量池
方法区
类信息
运行时常量池
JIT代码缓存
方法区和metaspace区别
类信息,运行时常量池,放在本地内存的元空间中
metaspace 快速溢出
反射,动态创建对象
可使用cglib
垃圾回收