ITKeyword,专注技术干货聚合推荐

注册 | 登录

JVM:类的生命周期

yexianyi 分享于 2016-07-28

推荐:java类的生命周期

这是今天一个同僚问我的问题,起初我觉得类的生命周期应该和对象的生命周期是一样的,找了一下相关资料才发现是有区别的。 下图是我从别处摘录的类生命周期图  

类的生命周期 综述 1.

只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2.

若在加载一个类的过程中,有其他类被切实使用到,则会被一同级联加载到JVM中。 3.

当一个类中的某个符号被第一次使用到时,该类才会被初始化;当类被加载时,它并未被初始化。 4.

初始化顺序: 静态函数/变量初始化(Textual Order) 实例成员变量初始化 构造函数 加载(Loading) 1)类加载器通过类的全限定名来获取定义此类的二进制字节流 2)字节流-> 方法区运行时数据结构 3)在方法区生成java.lang.Class 对象 (作为这个类在方法区的入口) 验证 (Verification) 确保Class字节流中包含的信息符合当前JVM的要求,且不会危害虚拟机安全 1)文件格式验证 (验证字节流是否符合Class文件格式规范) 2)元数据验证(对元数据进行语义校验,确保符合Java语法) 3)字节码验证(对类的方法体进行校验,确保符合语义和逻辑) 4)符合引用验证(对类中的符号引用进行校验,以确保解析动作可正常执行) 准备(Preparation) 为类变量的静态字段在方法区分配内存并设置零值的阶段 1.

进行内存分配的对象仅包括类变量的static字段 2.

初始化的为变量的零值,而非默认值 解析(Resolution) JVM将常量池内的符号引用替换为直接引用的过程,包括 类/接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符 初始化(Initialization) 执行<clinit>()方法的过程 1.

<clinit>()方法是由类变量的赋值动作和static语句块合并产

推荐:java线程的生命周期

1.线程的生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程。每个Java程序至少包含一个线程:主线程。 (1)线程生命周期的五种状态 1.创建(当用

生的;合并后的顺序即自然语句顺序(Textual Order);static语句块只能访问定义在该语句块之前的变量,定义在其后的变量只能赋值,不能访问。 2.

JVM自动在子类<clinit>()方法执行之前,先执行父类<clinit>()方法 3.

若类中没有静态语句块,也没有对变量的赋值操作,则compiler可以不生成<clinit>()方法 4.

执行接口的<clinit>()方法前不需要先执行父接口的<clinit>()方法,当需要使用到父接口定义的变量时,再行初始化。 5.

接口的实现类在初始化时不会执行父接口<clinit>()方法 6.

JVM保证一个类的<clinit>()方法运行时是线程安全的;但是如果执行<clinit>()的线程退出该方法,其它线程被唤醒后不会再进入<clinit>(),即:一个类加载器下,每个类型只会被初始化一次。 Reference: https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html#9766 http://www.programcreek.com/2013/01/when-and-how-a-java-class-is-loaded-and-initialized/ http://www.programcreek.com/2011/10/java-class-instance-initializers/ http://stackoverflow.com/questions/7560721/when-does-the-jvm-load-classes

推荐:Java Applet的生命周期

在Java Applet的生命周期中,共有四种状态(初始态、运行态、停止态和消亡态)和四个方法:init()、start()、stop()和destroy()。 2n+kS$c:IV_[01. init()软

类的生命周期 综述 1.    只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2.    若在加载一个类的过程中,有其他类被切实使用到,则会被一同级

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。