jvm内存空间

jvm内存空间

1、程序计数器
程序计数器是java字节码文件执行过程中的计数器,字节码计数器通过改变数值来选取下一条需要执行的字节码,分支、循环、跳转、异常处理、线程恢复等等都需要依赖这个程序计数器完成。同时为了线程切换时能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器
程序计数器作用:
字节码解释器通过改变程序计数器数值来依次选取下一条需要执行的字节码,从而实现代码的流程控制。
在多线程情况下记录线程的位置,从而使得线程下次被切换回来时知道上次执行的位置。
程序计数器是唯一一个不会出现outofmemoryerror的内存区域,他的生命周期随着线程的创建而创建,随着线程的死亡而结束。
线程私有。
2、java虚拟机栈
与程序计数器一样java虚拟机栈也是线程私有的,他的生命周期和线程一样,描述的是java方法执行的内存模型,每次java方法调用的数据都是通过栈传递的。
java内存基本可以分为堆内存(heap)和栈内存(stack),其中的栈内存说的就是虚拟机栈,或者说是虚拟机栈中的局部变量表部分

局部变量表主要存放了编译器可知的java基本数据类型(byte boolean short int long char float double )和对象引用.
java虚拟机栈会出现两个异常
StackOverFlowError 和 OutOfMemoryError。
StackOverFlowError :当java虚拟机栈不允许内存空间动态扩充的话,当线程请求栈的深度超过当前java栈深度的时候就会出现StackOverFlowError。
OutOfMemoryError:当java虚拟机栈允许动态扩充时,且当线程请求栈时内存用完了,无法在扩充,此时抛出OutOfMemoryError。

Java 虚拟机栈也是线程私有的,每个线程都有各自的 Java 虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。

3、本地方法栈
和虚拟机栈发挥的作用非常相似,区别是:虚拟机栈为字节码服务,而本地方法栈为虚拟机使用的native方法服务。
本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种异常。
4、堆
java虚拟机中所管理的内存最大的一块,java堆是所有线程共享的一块内存区域,堆的唯一目的就是存放对象实例,几乎所有的对象实例和数组都在这里分配内存。
5、方法区
方法区和堆一样是各个线程共享的内存区域,他用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6、运行时常量池
运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池信息(用于存放编译期生成的各种字面量和符号引用)

既然运行时常量池时方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。
7、直接内存
直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 异常出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值