`
xzc520
  • 浏览: 14931 次
  • 来自: 杭州
社区版块
存档分类
最新评论

深入jvm笔记-类型的生命周期及垃圾收集

    博客分类:
  • java
阅读更多

类型的生命周期

 

类型装载连接初始化

所有的java虚拟机实现必须在每个类或者接口首次主动使用时进行初始化。

符合主动使用的六种情形,主动使用和被动使用的区别

         接口初始化与类初始化,它们的祖先初始化有何不一样。

        

装载        

步骤如下

通过该类型的完全限定名,产生一个代表该类型的二进制数据流

         解析这个二进制数据流为方法区内的内部数据结构

         创建一个表示该类型的java.lang.Class类的实例

        

验证

         在装载完成后就要进行连接,连接前要进行验证,出要是确认类型符合java语言的语议,不会危及虚拟机的完整性。具体验证过程参看资料。

 

准备

         验证结束后,虚拟机会为类变量分配内存,设置默认初始值。

 

解析

         类型常量池中寻找类,接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程。

 

初始化

         为了准备让一个类或者接口被首次主动使用,类变量赋予正确的初始值。 所有的类变量初始化语句和类型的静态化器都被java编译器收集在一起,放到一个特殊的<clinit>

方法中。初始化接口不需要初始化它的父接口。

 

对于常量不生成<clinit>方法,会被java编译器特殊处理。

 

对象生命周期

类实例化 java编译器为它编译的每一个类都至少生成一个实例初始化方法。javaclass文件中,这个方法称为”init”

 

垃圾收集以及终结

垃圾回收时调用一次finalize()方法

卸载类型

         当某个类型不能被触及时,这个类型可以被虚拟机卸载。

 

动态连接,解析及扩展

         Class.forName

         ClassLoader.loadClass

 

双亲委派

         初始类装载器和定义类装载器,委派过程。

 

CONSTANT_CLASS_INFO的解析以及其它项的解析

入口类型用来表示类和接口的符号引用。根据类型是否是数组,或者引用的类型是启动类装载器还是用户自定义的类装载器装载的,解析的细节有所不同,内容参看文档。

 

装载约束

         为了保证类型在不同命名空间保持一致性,java虚拟机定义了几种装载约束,它们分别是类型的全限定名,类型的定义类装载器和初始类装载器。

 

编译时常量解析

         被初始化为编译时常量的静态final变量的引用,在编译时被解析为常量值的一个本地拷贝。

 

直接引用

         类型的直接引用指向保存类型数据的方法区中的实现相关的数据结构。

类变量的直接引用指向方法区中保存的类变量的值。

类方法的直接引用指向方法区中的一段数据结构方法区中包含调用方法的必要数据。

指向实例变量和实例方法的直接引用都是偏移量,比较接口引用的方法和实例方法偏移量的不同点。

自定义装载器的使用以及类型卸载请参看文档。

 

 

垃圾收集

         用于回收内存且整理堆碎片,保证程序完整性,避免虚拟机崩溃,减少程序员的负担。

 

常用的垃圾收集算法

         引用计数,跟踪收集,压缩收集,拷贝收集,按代收集,自适应收集,火车算法。

 

终结

         终结方法finalize()调用时机问题。

 

对象可触及性的生命周期

         对象三种状态:可触及,可复活,以及不可触及。

         引用对象:java.lang.ref.Reference  SofeReference WeakReference PhantomReference

         强引用与几种弱引用的区别,详见文档。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics