JAVA虚拟机(一)内存管理

一.内存分配。java虚拟机在运行的时候,将会包含以下运行时数据区域:

JAVA虚拟机(一)内存管理_第1张图片

1.线程私有的部分:

程序计数器:可以看成是当前线程所执行字节码的行号指示器。字节码解释器就是通过改变这个计数器的值来确定下一条字节码指令。

虚拟机栈:虚拟机栈为虚拟机使用的java方法(也就是字节码)服务。用于存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表存放了基本数据类型(short,int,float,long,double,byte,char,boolean),以及对象的引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向代表对象的句柄的位置)

本地方法栈:本地方法栈为虚拟机使用到的native方法服务。

2.线程共享的部分:

java堆:用来为创建的对象分配内存。

方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据。

 

二.对象的创建

1.内存分配

2.将除了对象头的空间都分配为零值

3.对对象进行必要的设置,这部分信息存储在对象头中

4.执行对象的init方法,按照程序的指令初始化对象

 

三.对象的内存布局

分为三部分:

1.对象头:一是存储对象自身的运行时数据,二是存储指向对象的类元数据的指针,虚拟机通过这个指针来判断这个对象是哪个类的实例;

2.实例数据:这部分才是对象真正存储的有效信息;

3.对齐填充:HotSpot虚拟机要求对象的起始位置必须是8的倍数,而对象头部分正好是8的倍数,当实例数据不是8的倍数时,由对其填充部分补齐。

四.对象的访问定位

目前的主流方法有使用句柄和直接指针两种方式

1.使用句柄:使用这种方法,在java堆中会分配一部分内存空间作为句柄池,栈中的reference引用指向堆中对应的句柄,而句柄包含了对象的实例数据和对象的类型数据各自的地址信息。

JAVA虚拟机(一)内存管理_第2张图片

2.直接指针:栈中的reference引用直接指向堆中的对象实例,而实例中会有一部分信息记录对象对应的类型数据的地址。HotSpot使用的该种方式执行对象访问。

JAVA虚拟机(一)内存管理_第3张图片

 

你可能感兴趣的:(JVM虚拟机)