首页 > 编程语言 > 详细

Java方法区

时间:2019-11-14 14:22:31      阅读:82      评论:0      收藏:0      [点我收藏+]

一 方法区描述

技术分享图片

1、类型信息

    类型的全限定名
    超类的全限定名
    直接超接口的全限定名
    类型标志(该类是类类型还是接口类型)
    类的访问描述符(public、private、default、abstract、final、static)

2、类型的常量池

存放该类型所用到的常量的有序集合,包括直接常量(如字符串、整数、浮点数的常量)和对其他类型、字段、方法的符号引用。常量池中每一个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对象(在动态链接中起到核心作用)。

3、字段信息(该类声明的所有字段)

    字段修饰符(public、protect、private、default)
    字段的类型
    字段名称

4、方法信息

方法信息中包含类的所有方法,每个方法包含以下信息:

    方法修饰符
    方法返回类型
    方法名
    方法参数个数、类型、顺序等
    方法字节码
    操作数栈和该方法在栈帧中的局部变量区大小
    异常表

5、类变量(静态变量)

指该类所有对象共享的变量,即使没有任何实例对象时,也可以访问的类变量。它们与类进行绑定。

6、 指向类加载器的引用

每一个被JVM加载的类型,都保存这个类加载器的引用,类加载器动态链接时会用到。

7、指向Class实例的引用

类加载的过程中,虚拟机会创建该类型的Class实例,方法区中必须保存对该对象的引用。通过Class.forName(String className)来查找获得该实例的引用,然后创建该类的对象。

8、方法表

为了提高访问效率,JVM可能会对每个装载的非抽象类,都创建一个数组,数组的每个元素是实例可能调用的方法的直接引用,包括父类中继承过来的方法。这个表在抽象类或者接口中是没有的,类似C++虚函数表vtbl。

9、运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分.Class文件中除了有类的版本/字段/方法/接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将类在加载后进入方法区的运行时常量池中存放.

Java虚拟机对Class文件每一部分(自然也包括常量池)的格式都有严格规定,每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机任何/装载和执行,但是对于运行时常量池,Java虚拟机规范没有做任何细节的要求,不用的提供上实现的虚拟机可以按照自己的需要来实现这个内存区域.不过,一般来说,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中.

运行时常量池相对于Class文件常量池的另外一个重要特征就是具备动态性,Java语言并不要求常量一定只有在编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法.

既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常.

二 方法区特征

1 线程共享

方法区是堆的一个逻辑部分,因此和堆一样,都是线程共享的.整个虚拟机只有一个方法区.

2 永久代

方法区中的信息一般需要长期存在,而且它又是堆的逻辑分区,因此用堆的划分方法,我们把方法区称之为老年代.

3 内存回收效率低

方法区中的信息一般需要长期存在,回收一遍内存之后可能只有少量信息无效.对方法区的内存回收的主要目标是:对常量池的回收和对类型的卸载.

4 Java虚拟机堆方法区的要求比较宽松

和堆一样,允许固定大小,也允许可扩展的大小,还允许不识闲垃圾回收.

 

Java方法区

原文:https://www.cnblogs.com/Open-ing/p/11856399.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!