java 内存之方法区详解

(一)与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

(1) 在一个 JVM 实例的内部,类型信息都会被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载时从类文件(.class文件)中提取出来的,类变量(类中静态变量)也存储在方法区中。

(2) JVM 运行应用时要大量的使用存储在方法区中的类型信息,其次方法区是被所有线程共享的,必须要考虑数据的线程安全。假如有两个线程都在视图找寻 Animal的类,在Animal类没有被加载的情况下,只应该有一个线程去加载,另外一个线程只有选择等待状态。

(二)java 方法区详解存储内容

(1)存储 JVM 中类的类型信息(对每一个加载的类型, JVM 必须在方法区中存储以下的类型信息)

     ● 这个类型的完整有效名;

    ● 这个类型直接父类的完整有效名(除非这个类型是 interface 或者是java.lang.Object,这两种轻快下都没有父类);

● 这个类型的修饰符(public,abstract,final的某个子集);类型名称在java类文件和jvm中都以完整有效名出现。在java源代码中,完整有效名由类的所属包名称加一个".",再加上类名 组成。例如,类Object的所属包为java.lang,那它的完整名称为java.lang.Object,但在类文件里,所有的"."都被 斜杠“/”代替,就成为java/lang/Object。完整有效名在方法区中的表示根据不同的实现而不同。

 

     除了上述的基本信息外,JVM 还要为每一类型保存以下信息:

类型的常量池( constant pool);

域(Field)信息;

方法(Method)信息;
除了常量外的所有静态(static)变量。 

 

(2)常量池 
jvm为每个已加载的类型都维护一个常量池。常量池就是这个类型用到的常量的一个有序集合,包括实际的常量(String, Integer, 和Floating point常量)和对类型,域和方法的符号引用

池中的数据项像数组项一样,是通过索引访问的。 因为常量池存储了一个类类型所使用到的所有类型,域和方法的符号引用,所以它在java程序的动态链接中起了核心的作用。 

(3)域信息(程序中的一个范围)
jvm必须在方法区中保存类类型的所有域的相关信息以及域的声明顺序 

域的相关信息包括: 
域名;  域类型;  域修饰符(public, private, protected,static,final volatile,transient的某个子集) 
        
(4)方法信息 
jvm必须保存所有方法的以下信息,同样和域信息一样包括声明顺序

方法的相关信息包括:   方法名;   方法的返回类型(或 void);   方法参数的数量和类型(有序的);  方法的修饰符(public, private, protected, static, final, synchronized, native, abstract的一个子集)除了abstract和native方法外,其他方法还有保存方法的字节码(bytecodes)操作数栈和方法栈帧的局部变量区的大小。           


(5)类变量
 (Class Variables 译者:就是类的静态变量,它只与类相关,所以称为类变量 ) 
● 类变量被类的所有实例共享,即使没有类实例时你也可以访问它。这些变量只与类相关,所以在方法区中,它们成为类数据在逻辑上的一部分。在jvm使用一个类之前,它必须在方法区中为每个non-final类变量分配空间。
常量(被final修饰的类变量)的处理方法则不同,每个常量都会在常量池中有一个拷贝。non-final类变量被存储在声明它的类信息内。 


注意:java类中的成员变量有静态和非静态,静态成员变量是共享数据,在共享区,也叫方法区中;

非静态成员变量在堆内存中,作用于整个类中(在堆上创建对象时即给其分配区域)

而局部变量在栈内存内,jvm虚拟机栈为每一个类都分配一个栈帧,用于存放函数中的局部变量(基础类型),对象的引用类型都会在此分配内存,引用指向的对象是在堆上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值