JVM运行数据区说明

1. JVM运行数据区概览

jvm运行数据区图例

在这里插入图片描述

图例说明

  • JVM运行数据区可以划分为线程独占和线程共享两部分
  • 线程独占(封闭): 每个线程都拥有它的独立的内存空间,jvm在运行程序时就会为线程开辟一个内存空间来存储线程相关的信息,随着线程生命周期创建和销毁
  • 线程共享: 所有线程都能够访问当前的数据区域,随着GC的生命周期的创建和销毁
2. JVM运行数据区分解说明

线程共享

  • 方法区

    • 用于存储被JVM加载的类信息、常量、静 态变量、即时编译器编译(JIT编译)后的代码等数据
    • 属于一个逻辑区域,根据不同的hotspot VM来实现,如jdk7方法区存放在永久代,而jdk8存放在元数据空间,通过GC机制来对当前区域进行管理
  • 堆内存(也称为“主内存”/“共享内存”区域)

    • 划分为老年代, 新生代(Eden/From Survivor/To Survivor)
    • JVM启动的时候会根据系统分配的堆内存策略从计算机申请内存空间,主要用于存储类实例信息
    • GC回收器本质上是对堆内存的管理
    • 此区域会抛出OutOfMemoryError

线程独占

  • 虚拟机栈
    • 描述虚拟机VM在java在线程中执行方法的内存模型,是属于线程私有的一块独立空间线程栈
    • 线程栈包含多个栈帧
    • 一个线程会执行一个或者多个方法,一个方法对应一个栈帧
    • 栈帧内容包含: 局部变量表,操作数栈,动态链接,方法回收地址,附加信息等,用来存储数据和部分结果过程的数据结构,同时也被用来处理动态链接,方法返回值和异常分派
    • 栈帧随着方法的生命周期创建和销毁(不论是方法正常退出还是异常退出)
    • 会抛出StackOverflowError
  • 本地方法栈
    • 描述虚拟机VM执行用native修饰的方法
    • 虚拟机VM没有详细描述其规范,不同的VM将由对应不同的厂商实现
    • 会抛出StaclOverflowError
  • 程序计数器
    • 对于执行native方法,程序计数器存储为空
    • 对于执行java方法,程序计数器主要是记录当前线程执行的字节码位置,存储字节码执行指令的地址
    • 每个线程都会在对应的线程栈创建存储计数器的空间,目的是记录执行字节码指令,因此占用空间比较少
    • 作用: 就是在同一时刻,同一个CPU执行只能执行一个线程方法,在并发多线程情况下,为了能够记住当前线程执行的字节码指令位置,需要借助程序计数器来记录对应的地址,当线程被唤醒的时候,将会根据程序计数器的位置继续往下执行

参考jvm规范

https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-2.html#jvms-2.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疾风先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值