一、Android 虚拟机内存模型

2019-06-16  本文已影响0人  石器时代小古董

jvm运行时数据区域解析
刘望舒的BLOG
虚拟机的内存模型

一、内存模型

image.png

1.程序计数器: 确定程序指令执行顺序的,是唯一一块不会发生内存溢出的区域

它是线程私有的,负责记录当前线程空间字节码执行的行号(当线程切换后,由于有程序计数器来记录执行的地方,所以能够正确恢复到指定的位置)

2. Java虚拟机栈

**它也是线程私有的,负责存储方法内的局部变量,方法出口等。每执行一个方法都相当于压如一个栈帧,方法执行完比后这个栈帧从Java虚拟机栈中弹出。

3.本地方法区
负责管理虚拟机用到的 C 的方法。

4.堆内存区域
Java堆是一块被所有线程共享的区域,用来存放对象的实例。它不需要物理上连续,只需要逻辑上连续就可以。

5.方法区
方法区是被所有线程共享的的内存区域,用来存放已经被Java虚拟机加载的类的结构信息:运行时常量池,字段,方法信息,静态变量等数据。

当虚拟机读入一个 class 文件后,会把这个 class 文件的信息存储到方法区中.

class文件的内容

ClassFile {

    u4 magic;                                     //魔数:0xCAFEBABE,用来判断是否是Java class文件
    u2 minor_version;                             //次版本号
    u2 major_version;                             //主版本号
    u2 constant_pool_count;                       //常量池大小
    cp_info constant_pool[constant_pool_count-1]; //常量池
    u2 access_flags;                              //类和接口层次的访问标志(通过|运算得到)
    u2 this_class;                                //类索引(指向常量池中的类常量)
    u2 super_class;                               //父类索引(指向常量池中的类常量)
    u2 interfaces_count;                          //接口索引计数器
    u2 interfaces[interfaces_count];              //接口索引集合
    u2 fields_count;                              //字段数量计数器
    field_info fields[fields_count];              //字段表集合
    u2 methods_count;                             //方法数量计数器
    method_info methods[methods_count];           //方法表集合
    u2 attributes_count;                          //属性个数
    attribute_info attributes[attributes_count];  //属性表
}
上一篇下一篇

猜你喜欢

热点阅读