zoukankan      html  css  js  c++  java
  • Java内存模型——方法区

    方法区(Method Area)

    ①      对每个加载的类型,JVM必须在方法区中存储以下类信息:

    1)        这个类型的完整有效名(类型信息

    类型名称在Java类文件和JVM中都以完整有效名出现。在java源代码中,完整有效名由类的所属包名称加一个".",再加上类名组成。例如,类Object的所属包为java.lang,那它的完整有效名为java.lang.Object,但在类文件里,所有的"."都被斜杠“/”代替,就成为java/lang/Object。完整有效名在方法区中的表示根据不同的实现而不同。

    2)        这个类型直接父类的完整有效名(除非这个类型是interface或是 java.lang.Object,两种情况下都没有父类

    3)        这个类型的修饰符(Public,Abstract, Final的某个子集)

    4)        这个类型直接接口的一个有序列表

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

    1)        类型的常量池(Constant Pool)

    JVM为每个已加载的类型都维护一个常量池

    常量池就是这个类型用到的常量的一个有序集合,包括实际的常量/字面量(StringInteger和Floating Point浮点常量)和对类型,域和方法的符号引用。池中的数据项象数组项一样,是通过索引访问的。 因为常量池存储了一个类型所使用到的所有类型方法的符号引用

    字面量:是用于表达源代码中一个固定值的表示法(如文本字符串,声明为final的常量值等)

    常量: (被声明为final的类变量)每个常量都会在常量池中有一个拷贝。non-final类变量被存储在声明它的类信息内,而final类被存储在所有使用它的类信息内。

    符号引用:(符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可—保证唯一性)类和接口的全限定名、 字段的名称和描述符、方法的名称和描述符。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。(类似于CONSTANT_Class_info的常量来表示的)

    常量池在Java程序的动态链接(运行期间也可能将新的常量放入池中)中起了核心的作用。

    2)        域(Field)信息 (字段信息)

    JVM必须在方法区中保存类型的所有域的相关信息以及域的声明顺序, 域的相关信息包括: 域名域类型域修饰符(public,private, protected,static,final,volatile,transient的某个子集)

    域:域是一种属性,可以是一个类变量(类的静态变量),一个对象变量,一个对象方法变量或者是一个函数的参数

    3)        方法信息

    JVM必须保存所有方法的一下信息,同域信息一样包含声明顺序,方法名方法返回的类型(也可以是void)、方法参数的数量和类型(有序的)、方法的修饰符(public, private, protected, static, final, synchronized, native, abstract的一个子集)除了abstract和native方法外,其他方法还有保存方法的字节码(bytecodes)、操作数栈和方法栈帧的局部变量区的大小异常表

    4)        类变量(除了常量外的所有静态(static)变量)

    类变量(类的静态变量)被类的所有实例共享,即使没有类实例时你也可以访问它。这些变量只与类相关,所以在方法区中,它们成为类数据在逻辑上的一部分。在jvm使用一个类之前,它必须在方法区中为每个non-final类变量分配空间。

    5)        指向类加载器的引用

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

  • 相关阅读:
    firefly rk3399 增加 HL340 驱动(编译内核)
    STM32移植ROS发布超声波信息
    路径规划基础A*算法
    ROS融合IMU笔记
    a2 任意角度选取设置
    如何用代码设置机器人初始坐标实现 2D Pose Estimate功能
    APP 链接ROS时出现pymongo.errors.ServerSelectionTimeoutError: localhost:27017 错误
    基于opencv+python的二维码识别
    SAP UI5学习笔记之(二)熟悉的HelloWorld
    SAP UI5学习笔记之(一)初识SAP UI5
  • 原文地址:https://www.cnblogs.com/MazeHong/p/JVM.html
Copyright © 2011-2022 走看看