JVM15_类的加载、链接、初始化、卸载、主动使用、被动使用(五)

⑦. 过程四:类的Using(使用)


①. 任何一个类型在使用之前都必须经历过完整的加载、链接和初始化3个类加载步骤。一旦一个类型成功经历过这3个步骤之后,便"万事俱备,只欠东风"就等着开发者使用了


②. 开发人员可以在程序中访问和调用它的静态类成员信息(比如:静态字段、静态方法)或者使用new关键字为其创建对象实例


⑧. 过程五:类的Unloading(卸载)


①. 类、类的加载器、类的实例之间的引用关系


在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器,调用Class对象的getClassLoader()方法,就能获得它的类加载器。由此可见,代表某个类的Class实例与其类的加载器之间为双向关联关系


一个类的实例总是引用代表这个类的Class对象。在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。此外,所有的Java类都有一个静态属性class,它引用代表这个类的Class对象


JVM15_类的加载、链接、初始化、卸载、主动使用、被动使用(五)



②. 方法区的垃圾回收


方法区的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型。


HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收


判定一个常量是否"废弃”还是相对简单,而要判定一个类型是否属于"不再被使用的类”的条件就比较苛刻了。需要同时满足下面三个条件


JVM15_类的加载、链接、初始化、卸载、主动使用、被动使用(五)


③. 类的卸载


启动类加载器加载的类型在整个运行期间是不可能被卸载的(jvm和jls规范)


被系统类加载器和扩展类加载器加载的类型在运行期间不太可能被卸载,因为系统类加载器实例或者扩展类的实例基本上在整个运行期间总能直接或者间接的访问的到,其达到unreachable的可能性极小


开发者自定义的类加载器实例加载的类型只有在很简单的上下文环境中才能被卸载,而且


一般还要借助于强制调用虚拟机的垃圾收集功能才可以做到。可以预想,稍微复杂点的应


用场景中(比如:很多时候用户在开发自定义类加载器实例的时候采用缓存的策略以提高系


统性能),被加载的类型在运行期间也是几乎不太可能被卸载的(至少卸载的时间是不确定的)。


上一篇:Linux crontab定时执行任务命令格式与详细例子


下一篇:对派生类的初始化