A.什么是对象的死亡。
1.对象的死亡就是对象被java的垃圾回收线程回收。
B.为什么需要对象的死亡。
1.每个对象的创建需要占用堆内存,堆内存的大小是有限制的。如果对象有生无死,由于空间有限,堆无法承担新生对象。
C.怎么判断该对象需要被杀死。
引子:我们知道对象创建以后存在堆中,堆区域是被线程所共享的。当一个线程执行的方法(栈帧)含有该对象的调用,线程就会将该对象的副本复制一份到自己的栈帧中。
对象的死亡标记是由垃圾线程执行特定的算法来标注其是否应该被清除的。当一个创建后的对象已经未被使用,或者它的引用不攒在任何线程的栈帧中,该对象就需要被垃圾回收器清楚。
死亡标记的算法一般有两种:引用计数法和可达性分析法。
引用计数法:当一个对象的地址陈在一个栈帧中,该对象的引用计数加一。当该栈帧弹栈,引用计数的数量减一。当一个对象的引用数量为0,即该对象需要被打上死亡印记。
可达性分析法:有GC Roots 向下寻址,依次搜寻对象,找到的对象加入到引用链上,未找到的对象则不在引用链上,即无人使用的对象,需被打上死亡印记。(打上了死亡印记不一定马上死,还有可能复活。)
补充1:对象的引用状态。
1.强引用。直接使用new关键创造的对象。
2.软引用。已经打上死亡印记的对象。
3.弱引用。下次gc一定会被清除的对象。
4.虚引用。正在被回收,向系统发送一个通知。
补充2:GC Roots 会是哪些对象。
1.jvm栈中引用的对象。
2.方法区的类静态属性引用的对象。
3.方法区中常量引用的对象。
4.本地方法栈JNI(nataive方法)引用的对象。
D.如何杀死对象。
杀死对象的工作是由gc线程控制的。
当线程创建对象,发现堆中的空间不够用了,这个时候就会触发Yong Gnenration 区域触发一次垃圾回收。