类的生命周期

来源:互联网 发布:python多行注释 编辑:程序博客网 时间:2024/04/28 23:07

的生命周期

 

展示的是生命周期流向

       在与初始化机相载时问题上,Java 范并没有其做格的定就使得 JVM 实现上可以根据自己的特点提供采用不同的装策略。

       初始化:Java 为类的初始化机做了格定"initialize on first active use"--" 在首次主使用初始化"

首次主使用的情形:

建某个的新--new、反射、克隆或反序列化;

用某个的静方法

使用某个或接口的静字段或对该字段赋值时final字段除外);

Java的某些反射方法

初始化某个的子类时

在虚机启动时某个含有main()方法的那个启动类

  除了以上几情形以外,所有其它使用JAVA型的方式都是被使用的,他不会的初始化。

       的卸:只有没有任何引用指向Class象的候,这时候才会卸载类的生命周期

       在同一个classLoader里面是class例只有一个

      根据ClassLoader的介,当第一次使用外部类时ClassLoader就会把该类JVM,然后就可以该类例,即象。一旦加,就会一直留内存,直到止。一个ClassLoader中肯定只能加一个。hashtable是用散列的方式来存储对象,散列算法采用的基数就是hashcode,也就是根据某个象的hashcode和某算法从而找到table中的某个位置,取到个位置存象。在javahashcode使用象的内存地址的。 可以一下:使用Class.forName()取一个Class象,多次一次得到的hashcode必然一

hashcode不同class例重新加了一次

如下:

A.class被加hashcode1 如果A.class不卸 再次加肯定失 jvm不允

除非A.class 所以再次加生一个新的A.class例,其hashcode2(当然有可能1

两次的hashcode不同基本可以确定A.class被重新加

       ClassLoader所加西是的元信息,些信息应该是被保留在一特殊的内存空内的,System.gc()是影响不了这块的。如果加的元信息多,这块会溢出,就是咱时见out of memorySystem.gc()应该是回收内存堆里的空,不会来回收里。(这块区域就是method area,方法区,所以sunjdk调优maxPermSize。而ibmjdk没有独立的方法区,也是放在heap载类只占用其本身明的空,没有多少。

A   class   or   interface   may   be   unloaded   if   and   only   if   its   class   loader   is   unreachable.   Classes   loaded   by   the   bootstrap   loader   may   not   be   unloaded. 

       System.gc()制回收,但它并不是立即回收,它只是通知虚机你想行一次制内存回收,至于什么时候真正行,这还得看虚机的策略。所以它是制的,但不是立即的jvm究竟什么时间进行,那是jvm自己的事,程序无

       垃圾收集器系有自己的一套方案来判断哪个内存应该被回收的,哪个是不符合要求不回收的。垃圾收集器在一个Java程序中的行是自的,不能行,即使程序能明确地判断出有一内存已无用了,是应该回收的,程序也不能制垃圾收集器回收内存。程序唯一能做的就是通过调System. gc 方法来""行垃圾收集器,但其是否可以行,什么时行却都是不可知的没有引用也不一定回收的,仅仅是可能被回收。虚机垃圾收集的触是由虚机自行决定的,

       堆很大而很小,但是我碰到的是堆溢出而不是溢出.你自己定义变量,怎也多不到哪里去。

 

参考

java 的生命周期 

 http://www.javaeye.com/topic/77006

解析 Java 象的初始化  

http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html

SUN JVM的内存管理方式

 http://www.javadby.com/ServletyuJSP/20071216/4398.html

 

 
原创粉丝点击