类加载
2021-05-19 11:20:42 13 举报
对一些基础方面的流程书写,方便后续回顾.
作者其他创作
大纲/内容
准备
新生代 1.2G
对象150M
词法分析
老年代 1.1G
Eden
S0
如果垃圾回收,可能会被回收掉的引用
ApplicationClassLoader
语法放心
执行native方法
父类构造方法
加载
S1
软引用public static SoftReference<User> user = new SoftReference()<User>(new User());
1M
操作数栈
连接
suvivor 1
清空区域
minor GC 2
执行init函数
父类静态变量/静态代码块
存活对象
抽象语法树
引用计数法
方法区
javac 编译
JVM的内存区域的划分
eden
负责加载核心的类库,比如C:\\Program Files\\Java\\jdk1.8.0_261\\jre\\lib
属性
方法
类加载器引用信息
字段信息
实例引用信息
父类变量/代码块
新生代
BootstrapClassLoader
字节码生成器
创建一个对象的过程
注解语法树
子类构造方法
分配内存
负责加载应用的ClassPath环境变量锁制定的路径的类
类加载检测
字面量
符号引用
文本字符串
类和结构全限定名
final 常量值
字段名称和描述符
基本类型数值
方法名称和描述符
局部变量表
引用类型
堆空间
弱引用public static WeekReference<User> user = new WeekReference()<User>(new User());
动态链接
负责加载一些核心的拓展类。jdk1.8.0_261\\jre\\lib\\ext
解析
S1 =100M
发现老年代也不够了,直接full GC
验证是否符合字节码规范[类规范]
已用700M
为当前类的对象分配内存
Extension ClassLoader
负责加载自定义的类加载器
类信息
判断一个对象能否被回收?
实例对象
可用200M
将类中的静态变量设置默认值
类是否重写了finialize()方法
运行常量池
直接内存
存活着的对象
CustomerClassLoader
初始化
Eden = 800M
S1: 100M
线程私有
方法出口
suvivor 0
验证
A obj = new A(); // 缘起
Eden区1G
语义分析
子类变量/代码块
对象头
实例数据
对齐填充 8的整数倍
markword
类型指针
数组长度
存储运行时自身的数据,包括GC年龄、锁标志、锁信息、hashcode等等
本地方法栈
minor GC 1
设置对象头
确定类要申请的内存空间,这个在类加载中解析就能够知道
老年代
可达性分析:通过GC ROOT往下延伸看是否被引用,无用则回收。GC ROOT 可以理解为局部变量表,也就是线程中是否有持有该对象的引用。只要你的对象被方法的局部变量表、类的静态变量引用,就不会被回收。
程序计数器
值的初始化
使用
剩余100M
剩余50M
来回交换
虚拟机栈
老年代=1G
对属性赋值,执行类的构造函数
双亲委派机制
强引用public static User user = new User();
解析类中含有的其他对象信息,将符号引用转化为直接引用。因为多态需要确定最终的值
比如静态变量这个时候都会给一个初始值比如0
Hellow.java
通过类的全限定名称将类加载成class对象.该对象会在方法区作为入口
年龄满了
类加载机制
S0 =100M
年龄15
子类静态变量/静态代码块
赋值过程
1. 首先检测new指令参数是否能在常量池中定位到符号引用.2. 检测是否有进行过加载解析初始化,没有则先对该类进行加载
卸载
这个阶段是将所有静态变量赋值,比如new,并且如果包含父类则先初始化父类
对象过大,直接晋升
S0: 100M
堆参数配置思路策略:1. 计算你的对象大概多大,2. 计算你的机器有多大3. 应用评估- 是否属于并发流量型- 是否本地缓存,老年代- 是否属于数据计算类型的应用 - 大对象- 是否属于大对象频发假设4核8G:- Xms: 3G // 初始化大小- Xmx: 3G // 最大值多少- Xmn: 2G - 代表新生代给2G
虚引用幽灵引用或者幻影引用,他是最弱的引用关系,几乎不用
栈
已用800M
0 条评论
下一页