Java类型的生命周期简介
这里要讲的是类型(Class)的生命周期而不是对象的生命周期,后续文章将描述GC的相关内容。
1. 类型的生命周期的开始
装载(Load)----->连接(Link)------>初始化(Initialize),而连接阶段分为三个子步骤----------验证(Verifiy)--->准备(Prepare)--->解析(Resolve)(可选的)。
见下图:
2. 卸载类型
首先:为何要卸载类型?
这个问题很简单,就像你的家里为什么要打扫一样,你们懂得!
因为每次加载一个Java类型,就要再方法区中开辟一块内存出来,存储与该类型相关的信息(可以参考
http://boy00fly.iteye.com/admin/blogs/1095263),方法区中的内存的占用会越来越多,所以如果不回收这些类型的话,你们懂的!
其次:何时要卸载?
其判断标准和与判断对象是否需要被回收的标准很类似。如果程序不再引用某类型,那么这个类型就可以卸载了。启动类装载器装载的类型永远是可触及的,所以永远不会内卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及的。如果某个类型的Class实例被发现无法通过正常的垃圾收集堆触及,那么这个类型就是不可触及的。
最后:如何判断动态装载的类型的Class实例在正常的垃圾收集过程中是否可以触及?
第一种:最简单的,如果程序保持对Class实例的明确引用,他就是可触及的。
第二种:如果在堆中还存在一个可触及的对象,在方法区中他的类型数据指向一个Class实例,那么这个Class实例就是可触及的。