牛骨文教育服务平台(让学习变的简单)
博文笔记

方法区的一些细节-1

创建时间:2017-08-18 投稿人: 浏览次数:280

前面讲到方法区用来存储被虚拟机加载的类信息、常量、静态变量等,这一篇来研究一下里面存储的细节。

类型信息:
对于每个已经被虚拟机加载的类,jvm在方法区中存储以下类型信息:
这个类型的完整有效名称(全限定名 包名+类名)
这个类型的直接父类的完整有效名称(接口或者 java.lang.Object 没有父类)
这个类型的修饰符(public abstract final )
这个类型直接接口的一个有序列表

除了以上信息,jvm还会为每个类型保存以下信息:
类型的常量池
域(属性)信息
方法信息
除了常量外的所有静态(static)变量

常量池:
jvm为每一个被虚拟机加载的类型维护一个常量池。常量池就是这个类型里用到的常量的一个有序集合,包括了实际的常量(被final修饰的),对类、属性、方法的符号引用。池中数据类似数组项,可以通过索引访问。

域信息:
jvm在方法区中保存类的所有域的相关信息以及声明顺序。
域的相关信息:
域名
域的类型
域的修饰符

方法信息:
jvm在方法区中保存类的所有方法的相关信息以及声明顺序
方法的相关信息:
方法的返回值(或者void)
方法的参数列表
方法的修饰符
方法的字节码操作数栈和局部变量表大小
异常表

静态变量:
静态变量即被static修饰的变量,它只与类相关,所以称为类变量。
类变量被所有该类实例共享,即使没有实例也可以访问。因为是与类相关的,所以类变量也成为类数据在方法区的一部分。在jvm加载一个类的时候,必须在方法区为每个non-final 类变量分配空间。

常量:
常量(final 修饰的类变量)处理方式与类变量不同,常量在每一个常量池里有一份拷贝。类变量存储在声明它的类信息内,而常量则存储在所有使用它的类的常量池里。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。