程序员-张三

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在java虚拟机中,被装载类型的信息被存储在一个逻辑上称为方法区的内存上。                        当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class中的二进制数据传输到虚拟机中,紧接着虚拟机提取器其中的信息,保护静态变量,保存到方法区中。

所有线程共享方法区,因此对方法区数据的访问必须被设计为线程安全的。

 比如有两个线程去访问一个java类,且这个java类还没有被装载到JVM中,这时就只能一个线程去加载,另一个等待。

方法区的不是连续的,且大小是不固定的,JVM会根据应用来调整其大小。方法区允许GC回收。因为JVM允许通过用户自定义的的类装载器来动态的扩展java程序。因此一些class也会成为程序“不再引用”的类。JVM可以卸载这个类,从而使方法区占据内存保持最小。

 方法区主要存储以下类型信息:
 类型的全限定名;

 类型的直接超类的全限定名;

 类型是类类型还是接口类型;

 类型的访问修饰符;

 如何直接超接口的全限定名的有序列表;

全限定名(包名+类名),除了上面的基本类型信息外,还会存储被装载的类型的:

 常量池;

字段信息;

方法信息;

类(静态)变量;

ClassLoad的引用;

Class类的引用;

注意:

    常量池:JVM必须为每个被装载的类型维护一个常量池,常量池就是该类型所用的常量的一个有序集合,包括直接常量(string,integer 和floating point常量)和对其他类型,字段和方法的符号引用。池中的数据项就像数组一样是通过索引访问的。

  字段信息:对类型中的每个字段都必须保存,而且还要保存其声明顺序。(字段名,字段的类型,字段的修饰符。)

   方法信息: 同上,其顺序(方法名,返回类型,参数数量和类型,方法的修饰符)除了列出的条目外,如果某个方法不是抽象的和本地的,它还必须保存(方法的字节码,操作数栈和该方法栈帧中的局部变量区的大小,异常表)。

  静态变量:静态变量是由所有类实例共享的,但是即使没有任何实例,它可以被访问,它只与类有关,与实例无关。因此把它作为类型信息存储在方法区。并且必须分配空间。

 

 

posted on 2012-02-20 17:38  程序员-张三  阅读(134)  评论(0编辑  收藏  举报