jvm运行时的数据区域

有些是jvm启动的时候被创建,jvm退出时被销毁,剩下的是伴随着线程的,线程创建时被创建,线程退出时被销毁。



1.PC寄存器(program counter register)

在任何一个时刻,一个jvm线程都只能执行一个方法,如果这个方法不是本地方法,pc register就保存的现在正在被执行的方法的jvm指令地址,如果是本地方法,就没有定义。是唯一的一个在java虚拟机规范中没有任何规定OOMerror情况的区域

2.java虚拟机栈(jvm stacks)

每一个jvm线程都有一个私有的jvm stack,并且在线程启动的时候就被创建。保存帧,包括局部变量、部分结果、动态链接、方法的调用和返回。只有pop跟push操作,其他没有去维护。jvm stack的内存不需要是连续的。jvm stack既可以被实现成固定大小,也可以是根据计算动态扩展。

异常:

1)StackOverflowError:当一个线程请求分配的栈容量超过jvm允许的最大容量的时候抛出

2)OutOfMemoryError:当jvm stack是可以动态扩展,但在尝试扩展时没有足够的内存,或者创建新线程时在jvm stack初始化的时候没有足够的内存的时候抛出。

3.堆(Heap)

在jvm中堆是在jvm线程之间共享的,用来存储所有的类实例跟数组。在jvm启动的时候被创建。堆的实例存储是被自动存储管理系统(automatic storage management system,也就是常说的垃圾回收器garbage collector),这些对象无法被显示销毁。

堆所使用的内存不需要是物理连续的。

自动存储管理系统技术可以由程序员按照系统需求来选择,可以是固定大小或者是按照计算动态扩展,在max跟min的堆大小之间变动。

异常:

1)OutOfMemoryError:当计算需要的堆超过了自动存储管理系统能的最大容量的时候抛出。

4.方法区域(method area)

方法区域也是在jvm线程之间共享的。类似于传统语言的编译后代码,或者操作系统进程中的“text”段。存储了每一个类的结构信息,比如运行时常量池、字段、方法数据、

普通方法和构造函数的字节码,包括一些类、实例、接口初始化时用的特殊方法。

异常:

1)OutOfMemoryError:方法区域的内存不能满足内存分配请求的时候抛出。

5.运行时常量池(run-time constant pool)

class文件中所有类和接口的运行时的常量池表,在类或者接口被创建时被构建。包含了几种常量:编译时可以知道的数字字面值到运行时才知道的方法和字段引用。每个运行时常量池都是从jvm方法区域分配来的。

异常:

1)OutOfMemoryError:在创建类或者接口的时候,运行时常量池请求内存超过jvm运行时常量池的最大的时候抛出。

6.本地方法栈(native method stacks)

java虚拟机规范运行本地方法栈时固定大小或者计算时动态扩展。

异常:

1)StackOverflowError:当一个线程请求分配的本地方法栈容量超过jvm允许的最大容量的时候抛出

2)OutOfMemoryError:当本地方法栈是可以动态扩展,但在尝试扩展时没有足够的内存,或者创建新线程时在jvm stack初始化的时候没有足够的内存的时候抛出。


栈帧的概念



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值