a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 116|回复: 1

[软件设计师] 2012年软考软件设计师辅导之Java虚拟机类加载机制

[复制链接]
发表于 2012-8-2 09:08:23 | 显示全部楼层 |阅读模式
软件设计师Java虚拟机类加载机制,个人觉得要弄清楚,可以从如下两个方面去了解:   1.什么是类加载机制及虚拟机加载类的时机。
6 K% }2 s9 X/ d9 A  2.加载过程。 3 c5 `/ r( S3 ~
  首先看看第一个:虚拟机把描述类的数据从class文件加载到内存,并对class文件的合法性进行验证,引用转换及解析,最终形成可以被虚拟机使用的Java类型,这就是虚拟机的类加载机制。 & w9 k: ~$ N( {+ j
  由于java的动态扩展特点(就是可以在运行期指定具体类型),所以java的类加载过程都是在程序运行期完成。
. ?$ |1 f" h9 k$ I5 L5 a5 }  2.虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。 5 ^5 f8 ~( o: F- s" G# n5 l& m
  1.加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。
3 i5 Q% h  v* r8 U: ~1 `' k# @) k  1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final静态字段除外),以及调用类的静态方法的时候。 ' [) j6 y9 O8 D' G
  2)使用reflect包的方法进行类的反射调用的时候。
0 k" Z5 \/ h( U+ W# C+ G- v1 W4 @  3)当初始化一个类的时候,如果他的父类没有初始化,则先要触发父类的初始化。(注意这里是父类,如果是父接口的话,是不会触发父接口初始化成员变量的操作的,除非子类有引用父接口的变量)
( a7 u  L1 }) u7 r- e  4)虚拟机启动时,虚拟机会首先加载用户指定的一个要执行的主类(包含main方法的)
- m6 b: d' A+ l! ?- I; t9 h$ A+ ?  注:以上称为主动引用。有些情况是不会触发类的加载和初始化的。如:通过子类引用父类的静态字段,不会触发子类初始化;通过数组定义来引用类,不会触发此类的初始化;调用常量不会触发定义常量的类的初始化。 " e6 P. l  W0 b! }) R; _
  在确定了什么时候会触发加载操作后,再来看看加载过程主要做些什么:   t9 q# d9 f% g$ `4 R) {
  1通过类的全限定名来获取定义此类的二进制字节流。这个过程涉及到类加载器的过程,将在后面具体在写。
( A# V; O% B% {; s6 ~6 C  2将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构。方法区的数据结构每个虚拟机实现都可以不一样。 - X* _2 n. ^- p
  3在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的外部访问入口。
0 Z+ @) d) ~( ]! ^  第一步到此就完成了。后面会继续介绍第二阶段验证。
/ B. P2 S# K! i0 q5 e1 q  软件设计师Java虚拟机类加载机制,个人觉得要弄清楚,可以从如下两个方面去了解: ! ?$ d" n, H% ]$ |
  1.什么是类加载机制及虚拟机加载类的时机。 * c2 |3 H" t9 F9 q% R2 V. c6 V6 P
  2.加载过程。
7 E5 g0 h. w! o  f. c7 p. }6 l! j, p9 A# G3 J  首先看看第一个:虚拟机把描述类的数据从class文件加载到内存,并对class文件的合法性进行验证,引用转换及解析,最终形成可以被虚拟机使用的Java类型,这就是虚拟机的类加载机制。   h) P4 b8 ?' @% h9 b1 S
  由于java的动态扩展特点(就是可以在运行期指定具体类型),所以java的类加载过程都是在程序运行期完成。
4 O+ s; Q# @5 w  2.虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。 / X7 ~' a0 N) V- L: Z1 o
6 Y( M  [) u5 [; v6 Y* n  t& W7 \
  1.加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。
回复

使用道具 举报

 楼主| 发表于 2012-8-2 09:08:24 | 显示全部楼层

2012年软考软件设计师辅导之Java虚拟机类加载机制

</p>  1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final静态字段除外),以及调用类的静态方法的时候。 . K9 v5 Q1 i  C6 d8 E2 z1 D( l( J
  2)使用reflect包的方法进行类的反射调用的时候。 : y3 a% j3 J5 f* D5 M
  3)当初始化一个类的时候,如果他的父类没有初始化,则先要触发父类的初始化。(注意这里是父类,如果是父接口的话,是不会触发父接口初始化成员变量的操作的,除非子类有引用父接口的变量) ' v, }$ z$ p" z4 G
  4)虚拟机启动时,虚拟机会首先加载用户指定的一个要执行的主类(包含main方法的)
9 M/ _; ?: v: R  注:以上称为主动引用。有些情况是不会触发类的加载和初始化的。如:通过子类引用父类的静态字段,不会触发子类初始化;通过数组定义来引用类,不会触发此类的初始化;调用常量不会触发定义常量的类的初始化。 4 |3 q9 S5 e! v0 }8 m, E7 Y; D
  在确定了什么时候会触发加载操作后,再来看看加载过程主要做些什么:
# L) @! b5 ?/ g4 x0 r( h  1通过类的全限定名来获取定义此类的二进制字节流。这个过程涉及到类加载器的过程,将在后面具体在写。
( \3 r7 Y! l/ [! c( h0 q  2将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构。方法区的数据结构每个虚拟机实现都可以不一样。   {0 P+ ~+ I" z" _
  3在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的外部访问入口。
) N7 S4 n8 P/ I3 i  第一步到此就完成了。后面会继续介绍第二阶段验证。 $ Y# A: g; E4 `. T' I8 Q
  软件设计师Java 虚拟机类加载机制,个人觉得要弄清楚,可以从如下两个方面去了解:
, h! ~* L& m1 u/ B( c( O  1.什么是类加载机制及虚拟机加载类的时机。 8 _, F! J) s) N
  2.加载过程。
8 d: K$ L$ P' Y3 t$ N  首先看看第一个:虚拟机把描述类的数据从class文件加载到内存,并对class文件的合法性进行验证,引用转换及解析,最终形成可以被虚拟机使用的Java 类型,这就是虚拟机的类加载机制。 ' \; j  a+ \) }/ J% o
  由于java的动态扩展特点(就是可以在运行期指定具体类型),所以java的类加载过程都是在程序运行期完成。 8 Z5 n% K0 J& L, G/ J* v
  2.虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。
6 E. e1 {/ j8 I. I8 m4 q0 [  1.加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。 ; M2 _" p8 Y. l: s/ b
  1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final 静态字段除外),以及调用类的静态方法的时候。
4 I4 E. t/ ^) C  2)使用reflect包的方法进行类的反射调用的时候。
5 S5 d9 G6 a- E0 {# j  3)当初始化一个类的时候,如果他的父类没有初始化,则先要触发父类的初始化。(注意这里是父类,如果是父接口的话,是不会触发父接口初始化成员变量的操作的,除非子类有引用父接口的变量) , _! S! Q& a9 g
  4)虚拟机启动时,虚拟机会首先加载用户指定的一个要执行的主类(包含main方法的) 5 N% U" `4 y+ X/ |) X: f8 {
  注:以上称为主动引用。有些情况是不会触发类的加载和初始化的。如:通过子类引用父类的静态字段,不会触发子类初始化;通过数组定义来引用类,不会触发此类的初始化;调用常量不会触发定义常量的类的初始化。 " Z& l3 h8 }: l0 N0 {7 h& G
  在确定了什么时候会触发加载操作后,再来看看加载过程主要做些什么:
) V+ y& O2 k; z# ^& X9 j  1通过类的全限定名来获取定义此类的二进制字节流。这个过程涉及到类加载器的过程,将在后面具体在写。
! U5 G- x: G% F( L' [. T  2 将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构。方法区的数据结构每个虚拟机实现都可以不一样。 & z6 t, H( p) p& W$ T4 f) M
  3 在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的外部访问入口。
8 X3 _, ]3 k# V1 P$ q- E4 I  第一步到此就完成了。后面会继续介绍第二阶段验证。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-2 17:41 , Processed in 0.591127 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表