- 对象诞生
- 加载
- 加载时机
- 使用new关键字实例化对象
- 使用reflect方法对类型进行反射调用时候
- 处理静态字段,静态方法
- 含main主类会加载
- MethodHandle解析结果为get/put/invoke/ newInvoke special四种类型方法句柄
- 接口加入默认方法,实现主类初始化,接口需要先进行初始化
- 子类初始化,父类需要先初始化
- 加载过程
- 加载
- 验证
- 准备
- 解析
- 初始化
- 加载时机
- 分配内存
- 根据不同的算法收集器决定使用不同的内存分配方式
1.1 如果使用Serial,ParNew等压缩整理过程的收集器,系统采用的分配算法是指针碰撞
1.2 如果使用的是CMS(标记清楚算法),使用空闲列表分配内存 - 保证并发情况下的线程安全
2.1 CAS配上失败重试的方法保证更新操作的原子性
2.2 把内存分配的动作按照线程分化在不同的空间进行,即每个线程在Java堆中预先分配内存
- 根据不同的算法收集器决定使用不同的内存分配方式
- 初始化零值
保证了对象的实例字段在Java代码中可以不赋值就可以直接使用
- 必要设置
- 对类进行必要设置
1.1 属于哪个类的实例
1.2 如何才能找到类的元数据信息
1.3 对象的hash码
1.4 对象的GC分代年龄信息
1.5 是否使用偏向锁等
- 对类进行必要设置
- 构造函数
- 加载
- 对象消亡
- 判断对象死亡
- 判断死亡方式
-
引用计数器法
- 在对象添加一个引用计数器,每当一个地方引用它时,计数器加1;当引用失效时,计数器减一;不在被引用时,对象计数器为零。
- 虽然占用很多内存,但是效率较高,很难解决循环引用问题
-
可达性分析法
- 可以作为GCroot对象
- 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法对栈中引用的参数,局部变量,临时变量
- 在方法区中类静态变量引用的对象,譬如java类的引用类型静态变量
- 在方法区中常量引用的对象,譬如字符串常量池中的引用
- 在本地方法栈中JNI(Native)引用的对象
- Java虚拟机内部的引用,如基本类型对应的Class方法,一些常驻的异常对象,还有系统加载器
- 被同步锁持有的对象
- 反应Java虚拟机内部情况JMXBean,JVMTI注册的回调,本地代码缓存
-
- 死亡过程
- 对象不可达不一定非死不可,但最多会被标记两次
- 如果对象在进行可达性分析的时候,发现没有GC Roots相连的引用链,将会被第一次标记
- 判断是否需要执行finalize()方法,假如对象没有覆盖finalize()方法,后者方法已经被调用,都是没有必要执行
- 如果有必要执行,需要放入一个F-Queue的队列中,然后有一个低优先级的线程区执行finalize方法
- 判断死亡方式
- 垃圾回收算法
- 标记清除算法
- 标记复制算法
- 标记整理算法
- 垃圾处理器
- 标记整理
- Serial Old
- Paralled Old
- 标记清除算法
- CMS
- 标记复制算法
- Parallel Scavenge
- ParallelNew
- Serial
- G1
- 标记整理
- 判断对象死亡
对象的一生
最新推荐文章于 2025-04-29 11:22:51 发布