JAVAJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统Java

Java Memory Origin Java内存区域

2019-05-08  本文已影响4人  entro

Java Memory Origin Java内存区域

[TOC]
Java Memory Origin 全称Java Runtime Memory Origin。
详细划分共五大区域:Method Area,Heap,VM Stack,Native Method Stack,Program Counter Register.
有一种比较粗糙的划分就是堆栈划分。堆栈划分中的

一、堆栈划分

把Java内存分为堆内存和栈内存(Heap & Stack),的分法比较粗糙。但体现了大多数程序员最关注的、与对象内存分配最密切的内存区域是这两块。

二、五大内存区域划分

Memory Origin Thread Private、Share
Method Area Share
Heap Share
VM Stack Private
Native Method Stack Private
Program Counter Register Private
JVMMemoryOrigin.png
1.Method Area 方法区

共享数据区,别名Non-Heap,永久代(HotSpot for Jdk8 已经移除)

1.1Runtime Constant Pool 运行时常量池

方法区的一部分,存放编译器生成的各种字面量和符号引用。

2.Heap 堆

共享数据区,线程共享。

2.1内存回收角度划分

细分为:Eden空间、From Survivor空间、To Survivor空间等。
粗分为新生代、老年代。

2.2内存分配角度划分
3.VM Stack 虚拟机栈

隔离数据区,线程私有。
VM Stack记录的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame),用来存储局部变量表(堆栈分法的"栈"区域指的就是这块)、操作数栈、动态链接、方法出口等信息。
每个方法调用直至执行完成的过程就对应这一个栈帧在VM Stack中入栈到出栈的过程。

3.1局部变量表

局部变量表部分存放了

局部变量表所需要的内存在编译期间确定。当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的。方法运行期间不会改变局部变量表的大小

4. Native Method Stack 本地方法栈

隔离数据区,线程私有,HotSpot的实现将之合并到了VM Stack.

5. Program Counter Register 程序计数器

隔离数据区,线程私有。
Program Counter Register是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
每个线程都需要一个独立的Program Counter Register,这类每个线程独立存储的内存区域被称为"线程私有"内存。

三、堆栈划分Heap & Stack

Stack 栈(私有)

栈的优势是

栈的缺点是

Heap 堆(共享)

堆的优势是

堆的缺点是

四、对象结构 Object Structure(JDK6实现)

Object存储在Heap中,hotSpot虚拟机中(jdk6或之前的图),其结构如下:


Java_Object_Structure_Hotspot.png
4.1 head 对象头
4.1.1 markWord

markWord,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32/64位的虚拟机(未开启压缩指针)中分别为32/64bit。

状态 标志位 markWord存储内容
未锁定 01 对象哈希码、对象分代年龄
轻量级锁定 00 指向锁记录的指针
膨胀(重量级锁定) 10 执行重量级锁定的指针
GC标记 11 空(不需要记录信息)
可偏向 01 偏向线程ID、偏向时间戳、对象分代年龄
4.1.2 klass 类型指针

klass,类型指针,即对象指向它的类元数据的指针,hotSpot通过这个指针来确定当前对象是哪个类的实例。

4.2 instance data 对象实例数据

instance data 存储的是对象的有效信息,各种非静态的变量(实例变量),包括父类继承的实例变量。

4.2 padding 对齐

由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,没有对齐使用padding补齐。

上一篇 下一篇

猜你喜欢

热点阅读