首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一张图读懂jvm之运行时数据区-堆、栈、以及程序计数器

你知道 java 程序在运行时数据是存储在哪里的吗?比如,常量数据,临时计算结果,你知道栈溢出和内存不足是怎么一回事吗?关注我,带你一起走进 jvm,原创不易,记得关注 + 收藏哦。

下面,我们来看下这张图:

运行时数据区分为:pc(program counter)寄存器、java 虚拟机栈、堆、方法区、运行时常量池、本地方法栈。其中,运行时常量池属于方法区,下面是各自的详细介绍。

pc 寄存器又称:程序计数器,指的是:当前线程正在执行的字节码指令地址(行号),简单的说指的是当前线程执行到了哪一行,任意时刻,一个线程只会执行一个方法,pc 寄存器保存一个指向当前线程正在执行的语句的指针。程序运行时,字节码解释器通过改变 pc 寄存器里面的值,达到选取下一条要执行的字节码指令地址的目的。个人理解是,pc 寄存器存储当前正在执行的指令的字节码地址,当该指令结束,字节码解释器会选取下一条指令并修改pc寄存器里面的值,达到执行下一条指令的目的。对于字节码解释器而言,它存储的是下一条指令的地址。对于 native 方法而言,它存储的是空,即undefined,对于非本地方法而言,存储的是一个指针。

java 虚拟机栈与线程同时创建,存储栈帧,栈里面存放的数据是:局部变量与一些尚未计算好的结果。java 虚拟机栈的大小可以动态分配或者固定大小,但固定分配需要给用户设置大小的函数,java 虚拟机栈会出现 outOfMempryError 和 stackoverflowError

堆是线程共享的运行时内存区域,存储垃圾回收器管理的对象,也可以动态分配大小或者固定大小, 会出现 outOfMempryError 异常。

方法区:用于存放 运行时常量池( runtime constant pool )、字段和方法数据、构造函数和普通方法的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法,与堆类似,但可以不实现垃圾回收。也会出现 outOfMempryError

运行时常量池:class 文件中每 一个类或接口的常量池表的运行时表示,在方法区分配,加载类和接口到虚拟机后,就创建对应的运行时常量池

本地方法栈:即 native method stack,即非java语言的方法的栈,线程创建时按线程分配,与 java 虚拟机栈类似,可动态分配或固定大小,会出现 outOfMempryError 和 stackoverflowError,你可以理解为:支持本地方法执行所需的栈。

jvm 学习是痛苦的,暂时只有纯理论,关注我,后期带你手写一个 java 虚拟机。原创不易,记得关注 + 收藏哦,谢谢你的支持。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200210A04G2J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券