Java中类与对象的生命周期

上一篇 / 下一篇  2012-09-07 13:13:05 / 个人分类:Java

51Testing软件测试网.@1ISH3| EF9],d

  类的生命周期

JB/T;y,P:|(J5`051Testing软件测试网3R6VyT&ZMi

  .java源文件经过编译后会生成相应的字节码文件(.class)。jvm通过解释器翻译字节码文件并在系统中执行。51Testing软件测试网*E/](Jqu-spL

~ Qk4r2nTH~p0  而java类的生命周期就是其字节码文件装载、连接、初始化、使用、和卸载的整个过程。51Testing软件测试网UQ @WOt

51Testing软件测试网?)u*ckS#t `_!B

  ● 装载。

q&DAJ(r051Testing软件测试网$H3U%m5j d K

  jvm找到需要装载的类,将类的信息装载到jvm的方法区中。然后在堆区实例化一个java.lang.Class对象,作为方法区中的类的信息入口。51Testing软件测试网d O'e4g!vW)mu Qi

e/I8~1^$A qIDN0  不同的jvm对于类的装载时机并不相同,有些在遇到这个类时就装载这个类(虽然并不知道这个类是否会被用到),另一些则在真正用到一个类的时候才对它进行装载。

e L$x~kzc;mg0

!b6O:z_#s7gY)wV;I;ep+V0  ● 连接阶段。连接阶段一般情况下在一个类加载了一部分之后就开始,与装载阶段交叉进行。连接阶段主要做一些加载后的验证以及初始化的准备工作,分为验证、准备、解析三个子阶段。51Testing软件测试网s6{t0Veb

+[1A8z(@ya0  1、验证主要是验证一个被加载的类是否合法,以确保这个类能够被jvm运行。

V,D:W-N7]}0

Yg t2UP#n0  2、准备阶段为类中的静态变量分配内存和jvm默认初值(不是程序中设定的初值。对于jvm,基本类型的默认处置为0,而引用类型为null),并为常量分配我们在程序中设定的初值。

&{Y@S+j|T/C051Testing软件测试网d^{+R"A+P Z

  3、解析是指把常量池中的符号引用转换为直接引用,即将所有的类名、接口名、字段名、方法名转换为具体的内存地址。

@b9{f.dB~'Z0

FSi nr vX0  ● 如果一个类被直接引用,则会触发类的初始化。被动引用则不会触发类的初始化。

k'@+@RO9\_{051Testing软件测试网t%ro+IX

  直接引用的情况有:

PRSS O4Z5Q8N051Testing软件测试网9NTN@,}0@o

  1、创建类的新实例51Testing软件测试网T^fkqF7@ }

51Testing软件测试网r*R$^H(zQ

  2、调用类的静态方法

?0Q&\J2Q2v051Testing软件测试网 {}_ e`TJ!Ju({'H

  3、操作类或接口的静态字段(final字段除外)51Testing软件测试网-Y{}t2y6I

Bke h"@u0  4、调用Java的特定的反射方法51Testing软件测试网 k1iYN:\J2@z6W2E

51Testing软件测试网'Q{7W#r G/^Ry

  5、初始化一个类的子类51Testing软件测试网 F!K|;m:|u.Zq

ib^ Sp hy#D0  6、指定一个类作为Java虚拟机启动时的初始化类

W!Pg @8f051Testing软件测试网#N5S)AZ5?3e

  初始化过程会初始化与类相关的赋值语句和静态语句(即有static关键字修饰的信息),其他语句在实例化对象的时候才会运行。

st3Q*fD i051Testing软件测试网\@(a(vAD8s O

  初始化按照顺序运行类中的赋值语句和静态语句。如果有父类,则首首先运行父类中的语句。

c+p%Y%U)e!ho9`051Testing软件测试网(xG)@+s3yoo#q(c

  以下情况不会引起类的初始化:

n8y)C u1o1O,rP h051Testing软件测试网Tp],MWZ[+`3X,L

  ◇ 定义类数组51Testing软件测试网 H#y8v X;Ms3M

51Testing软件测试网w]&V!_\

-P"X HOa.{ FO0
SampleClass[] samples = new SampleClass[5];
51Testing软件测试网q |,p:I2E

  ◇ 引用类的常量

3HfG7G3n.P!um051Testing软件测试网)D)Pje2o a"S4\

&O1qU$W-X0
String sampleConstant = SampleClass.SampleConstant;

pZN5Q8F0  ● 使用51Testing软件测试网aVro2~

51Testing软件测试网o4jBJ~%ts*u*}P2B

  类的使用包括主动引用和被动引用。只有主动引用会实例化类对象。

*P9?#q5F'Z l6|0

4S \N8wj o0  ● 卸载

#AD,xh+` tM RC0

{!`[7?1g/G]0  如果下面的所有情况都成立,类将会被卸载:51Testing软件测试网m8csg;B9dY I

A7?0y#S q5s0  1、类所有的实例都已经被回收。(即堆中不存在该类的任何实例)51Testing软件测试网@ meE/eF,?;t

51Testing软件测试网0j1}B+yE y B~x xJ

  2、加载该类的ClassLoader被回收。

n+R\6~m'Ls051Testing软件测试网vy!]BZHxl

  3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。51Testing软件测试网Odx0}4v6b

8]/S0A`0I)L({P2e0  jvm在方法区垃圾回收的时候对类进行卸载,在方法区中清空类信息。

2G#X+\)T{!y]&G8@051Testing软件测试网LA|io7A

  至此,一个java类的生命周期结束。51Testing软件测试网cb3X N7i8v-be

yuvj R%m0  对象的生命周期

y$W v;U] F_)oY0

n en.s9s0eJ0  java对象是在jvm的堆区创建的。在创建对象之前,可能会触发类的加载、连接和初始化。

,ZbU?|gHX051Testing软件测试网yC-Kz |

  jvm在类初始化完成后,根据类的信息在堆区实例化类对象,初始化非静态变量和默认构造方法。

k$t;[+Li\:_3a0

} V;Vi`9j&m&M0  由于java在堆上创建对象,因此编译器对对象的生命周期一无所知。Java提供了垃圾回收器机制,jvm会在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。51Testing软件测试网7y"Gdf!uA


TAG:

 

评分:0

我来说两句

Open Toolbar