Method Area & Heap

Method area 通常用来存储 Class 相关的信息,如名称、构造器、方法等可以用 reflection API 看到的信息;Heap 通常用来存储各个instance 相关的信息,如各种 instance variables,因此通常 instance 的大小由 instance variables 的数量及类型相关。

创建 instance
SomeClass sc = new SomeClass();

当我们在程序中创建一个类的 instance 时,Method Area 和 Heap 的状态如下图所示:

如果此时 Heap 中不存在 SomeClass 的 Class object (java.lang.Class 的实例),JVM 会在 Heap 中创建 SomeClass 的 Class object,同时在 Method Area 中存储 SomeClass 的元信息,注意这里 Class object 与 class data 之间都留有对方的联系方式。以上步骤完成后,JVM 才会在 Heap 中创建 SomeClass 的 Class instance (图中的 object)。

Method Area

接下来看一下 Method Area 中都包含着 Class 的哪些信息:

  • 元信息 (Meta Info)
    • Names of type, superclass, super interfaces
    • Class or interface
    • Type modifiers: abstract, final public
  • 对 Class object 的引用 (Reference to Class object)
  • 字段信息 (Field Info)
    • Name & type
    • Modifiers: static, final, access modifiers, transient, volatile
    • 原始类型的静态变量 (primitive static variable) ,其它任何类型的变量都存储在 Heap 中。对于对象类型的变量,如果是static 的,则对变量对象的引用存储在 Method Area 中;如果是实例变量,则对变量对象的引用存储在 Heap 中。
  • Runtime Constant Pool: literals & symbolic references
  • 方法信息 (Method Info)
    • Name
    • Return Type
    • Number and type of parameters
    • Modifiers: static, final, access modifiers, abstract, synchronized, native
    • Method bytecode
  • Method Table: maintains array of references to instance methods。被用于实例方法调用

从 Java 8 开始,Method Area 被移到 Native Heap 中,被称为 Metaspace,移到 Native Heap 后 Metaspace 的大小不再受到 Java Heap 的限制。

Class data 在哪些地方会被用到
  • 调用实例方法
  • 检查 Type Cast 的正确性
Superclass obj = new Subclass();
Subclass subObj = (Subclass) obj;
  • instanceof 检查
subObj instanceof Subclass

results matching ""

    No results matching ""