学习JAVA虚拟机笔记一:运行时数据区域

JAVA虚拟机运行时数据区主要包含:方法区、堆、虚拟机栈、本地方法栈和程序计数器。

其中虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区;方法区、堆是由所有线程共享的的数据区。

1.程序计数器:是一块儿内存很小的区域,当前线程所执行的字节码的行号指示器,字节码解释器工作就是通过程序计数器的值来取下一条要执行的字节码指令,各个线程之间的程序计数器互不影响,独立存储,是线程私有的。

2、虚拟机栈:也是线程私有的,各个线程互相独立互不影响。虚拟机栈的生命周期和线程的生命周期相同,描述的是JAVA方法执行的内存模型:每个方法在执行的时候,都会在虚拟机栈中创建一个栈帧,这个栈帧用于存储方法的局部变量表、

操作数栈、动态链接、方法出口等信息;

每个方法从调用直到完成的过程就是一个栈帧在虚拟机栈中从入栈到出栈的一个过程。

异常:线程的请求的深度大于虚拟机栈的最大深度就会抛出:StackOverflowError;虚拟机栈动态扩展没有请求到要求的内存

的空间就会抛出: OutOfMemoryError

3、本地方法栈:它与虚拟机栈发挥的作用非常相似,主要是用于调用本地类库中的方法的执行,抛出的异常也是一样的。

4、方法区:有的也称为静态方法区,是各个线程共享的区域。主要用于存储已经被虚拟机加载的类信息、常量、静态变量、

即使编译器编译后的代码等数据。

 运行时常量池也是属于方法区

5、堆:各个线程共享的内存区域,是最大的一块内存区域。主要用来存放实例对象,几乎所有的实例对象都在这里分配;

这里也是垃圾回收管理的主要区域。

  直接内存虽然和堆内存没有直接关系,但是堆内存中存放着引用直接内存地址的对象。

**对象的创建**

JAVA虚拟机遇到一条new创建对象的指令时,首先要去方法区的常量池中检查,能否找到一个类的符号引用,并检查这个符号引用对应的类是否已经被加载、解析和初始化过,如果没有,就先执行类的加载,当类的加载通过后,然后再堆内存中给对象分配一定的内存空间。如果堆的内存空间绝对规整,则使用“指针碰撞”法分配;如果堆的内存空间不规则,则使用“空闲列表”法分配(至于使用哪一种由虚拟机决定,如果虚拟机的垃圾回收机制包含对内存的压缩整理则使用“指针碰撞”反之使用“空闲列表”)。内存空间分配好以后,虚拟机将分配到的内存空间都初始化成零值(不包括对象头)。接下来虚拟机对对象(其实就是对象头)进行必要的设置,例如该对象是哪个类的实例、如何找到类的元数据信息、对象的哈希值、对象的分代年龄等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值