运行时数据区——方法区

简介: 在Java虚拟机中, 关于被装载类的信息存储在一个逻辑上被称为方法区的内存中。 当虚拟机加载某个类型时,它使用类加载器定位相应的class文件,然后读入这个class文件——一个线性二进制数据流,然后将它传输到虚拟机中 ,紧接者虚拟机提取其中的类型信息, 并将这些信息存储到方法区。

在Java虚拟机中, 关于被装载类的信息存储在一个逻辑上被称为方法区的内存中。 当虚拟机加载某个类型时,它使用类加载器定位相应的class文件,然后读入这个class文件——一个线性二进制数据流,然后将它传输到虚拟机中 ,紧接者虚拟机提取其中的类型信息, 并将这些信息存储到方法区。该类型中的类(静态)变量同样也是存储在方法区中。

由于所有线程都共享方法区, 因此它们对方法区数据的访问必须被设计为是线程安全的 。假设同时有两个线程都企图访问一个类, 而这个类还投有被装入虚拟机, 那么,这时只应该有一个线程去加载它,而另一个线程则只能等待。

方法区的大小不必是固定的, 虚拟机可以根据应用的需要动态调整。同样, 方法区也不必是連续的, 方法区可以在一个堆(甚至是虚担机自已的谁)中自由分配。 另外, 虚拟机也可以允许用户或者程序员指定方法区的初始大小以及最小和最大尺寸等 。

方法区也可以被垃圾收集, 因为虚拟机允许通过用户定又的类加载器来动态扩展Java程序, 因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用的类时, Java虚拟机可以卸裁这个类(垃圾收集),从而使方法区占据的内存保持最小。

运行时常量池

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

 

类型信息

类型信息

对每个装载的类, Java虚拟机都会在方法区中存储以下类型信息:

  • 这个类的全限定名
  • 这个类的直接超类的全限定名(除非这个类型是java.]ang.0t,ject,它没有超类)。
  • 这个类是类类型还是接口类型
  • 这个类的访问修饰符( public、 abstract或final的某个子集)。
  • 任何直接超接口的全限定名的有序列表

在Java class文件和虚拟机中, 类型名总是以全限定名出现。 在Java源代码中,全限定名由类所属包的名称加一个“.”,再加上类名组成。例如,类0bject的所属包为java.iang,那它的全限定名应该是java.lang.0bject,但在class文件里,所有的“.”都被斜杠 “/”代替,这样就成为java/lang/0bject。 至于全限定名在方法区中的表示, 则因不同的设计者有不同的选择而不同, 可以用任何形式和数据结构来代表。

 

 

参考:

http://www.hollischuang.com/archives/80

https://mritd.me/2016/03/22/Java-%E5%86%85%E5%AD%98%E4%B9%8B%E6%96%B9%E6%B3%95%E5%8C%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E5%B8%B8%E9%87%8F%E6%B1%A0/

 

 

相关文章
|
11天前
|
Java
JVM运行时数据区
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一
16 2
|
17天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
18 3
|
7月前
|
安全 Java
【JVM】运行时数据区、程序计数器
【JVM】运行时数据区、程序计数器
31 0
|
存储 Java 编译器
JVM 运行时数据区吗?
JVM 运行时数据区吗?
63 0
|
7月前
|
存储 Java C++
JVM 运行时数据区
JVM 运行时数据区
|
存储 Java 编译器
JVM面试专题-JVM运行时数据区的方法区
JVM面试专题-JVM运行时数据区的方法区可以详细聊聊吗?方法区与元数据区以及持久代到底是什么关系?什么是永久代?什么是元数据空间?
84 1
|
存储 Java 数据管理
jvm组成-运行时数据区
了解jvm组成-运行时数据区
50 0
|
存储 缓存 安全
【JVM】3. 运行时数据区及程序计数器
【JVM】3. 运行时数据区及程序计数器
|
存储 算法 安全
必知必会JVM二-运行时数据区
必知必会JVM二-运行时数据区
63 0
|
存储 缓存 算法
Java虚拟机之运行时数据区
Java虚拟机之运行时数据区
118 0
Java虚拟机之运行时数据区