JVM运行时数据区域

在这里插入图片描述

程序计数器

程序计数器是一块较小的内存空间,它可以被看作是当前线程所执行的字节码的行号指示器。字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。
程序计数器是线程私有的内存。Java多线程是通过线程的轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一个独立的程序计数器,各条线程之间的计数器互不影响,所以称为"线程私有的内存"。没有OOM情况。

JVM栈

与程序计数器一样,JVM栈也是线程私有的。它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行时,Java虚拟机就会同步创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法返回地址(方法出口)等信息。
局部变量表:存放了编译时期可以可知的Java虚拟机基本数据类型(八大基本数据类型)和对象引用(reference类型,不等同与对象本身)。
操作栈:它是每个方法都会生成的栈
动态链接:指向字符串常量池
方法的返回地址:pc寄存器的地址

本地方法栈

本地方法栈与虚拟机栈所发挥的作用十分相似,其区别就是Java虚拟机栈是为Java方法来服务的(也就是字节码),而本地方法栈它是为JVM使用到的本地(Nativa)方法来服务的。也是线程私有的。
栈深度溢出和栈扩展失败时也会抛出StackOverFlowError和OOM异常。

Java堆

堆区是所有线程共享的一块内存区域,所有创建对象的信息都在这个区域,堆也是JVM最大的一块内存。
堆在JVM启动时创建,此内存的唯一目的就是为了存放对象实例。java堆是垃圾收集器管理的内存区域,也被称为"GC堆"。Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这就像我们的磁盘空间去存储文件一样,并不要求每个文件都连续存放。Java堆既可以被设置为固定大小的,也可以是扩展的(通过-Xmx和Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法在扩展的时候,就会有outofmemoryerror异常。

方法区

方法区也叫永久代,JDK1.8叫元空间。与Java堆一样,是各个线程共享的内存区域。方法区存储了已经被JVM加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
会有OOM异常。
运行时常量池:是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等信息描述外,还有一项信息就是常量池表,用于存放编译时期生成的各种字面量与符号引用,这部分内容将在类加载后存放到到方法区的运行时常量池中。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值