狂人思维·成都
Google
软件架构,开则持续,合则稳健;亦开亦合,刚柔并济;讲究平衡如同生活之中庸和谐.
E-MAIL:guojian。zhang@gmail。com
posts - 19,  comments - 62,  trackbacks - 0

[摘要]

类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见。

本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的冲突问题。


本文发表于IBM DW,详细正文请见 解析JAVA类和对象的初始化过程
网址:http://www-128.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html

posted on 2006-09-08 10:15 狂人思维·成都 阅读(2210) 评论(4)  编辑  收藏 所属分类: JAVA技术J2EE应用

FeedBack:
# re: 深入JVM内部解析类和对象的初始化过程
2006-09-13 00:38 | 飞飞

张先生:你好,很佩服你的精彩阐述
我有几个疑问:1) 按照你的解决方法思路就是在对象实例化之前JVM已经调用了clinit()方法了,也就是类已经初始化了,所以类变量也已经初始化了
我想问你这是怎么触发类初始化的
2) 你在文章中提到init()方法包括了"所有具有指定初始化值的实例变量初始化语句",既然如此为什么没有执行CODE_MAP_CACHE = new HashMap()呢?
希望能得到你的精彩回答!
谢谢!  回复  更多评论
  
# re: 深入JVM内部解析类和对象的初始化过程
2006-09-13 00:39 | 飞飞

我的邮箱是: zhangtf@sihitech.com.cn  回复  更多评论
  
# re: 深入JVM内部解析类和对象的初始化过程
2006-09-13 12:41 | 狂人
您好,
1) 按照你的解决方法思路就是在对象实例化之前JVM已经调用了clinit()方法了,也就是类已经初始化了,所以类变量也已经初始化了我想问你这是怎么触发类初始化的。

该问题在文中已有阐述:

* "Java 虚拟机规范为类的初始化时机做了严格定义:"initialize on first active use"--" 在首次主动使用时初始化"。"
*

首次主动使用的情形:
o 创建某个类的新实例时--new、反射、克隆或反序列化;
o 调用某个类的静态方法时;
o 使用某个类或接口的静态字段或对该字段赋值时(final字段除外);
o 调用Java的某些反射方法时
o 初始化某个类的子类时
o 在虚拟机启动时某个含有main()方法的那个启动类。


2) 你在文章中提到init()方法包括了"所有具有指定初始化值的实例变量初始化语句",既然如此为什么没有执行CODE_MAP_CACHE = new HashMap()呢?

"CODE_MAP_CACHE = new HashMap()"语句是执行了的,并非您理解的"没有执行",而是在对象实例化时调用initEnum()方法对CODE_MAP_CACHE初始化并赋值后,又重新在static{ ... }区块内进行了初始化。这是因为在类还未来得及初始化完毕时,在类自身有一条实例化自身的语句"private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();"所导致的。   回复  更多评论
  
# re: 深入JVM内部解析类和对象的初始化过程
2006-09-17 18:01 | 化工
楼主说的确实对我很有用,多谢了!@_@~~  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿

随笔分类(31)

随笔档案(19)

文章分类(3)

文章档案(3)

我关注的Blogs

搜索

  •  

最新评论

阅读排行榜

评论排行榜