JVM内存结构

img

局操常返附

这里写图片描述

局操常返附

就是一个主要用于存放对象的内存区域,线程共享的一块区域,堆允许程序在运行时动态地申请某个大小的内存空间

堆中有一个不得不提的事 — 垃圾回收(GC),详细见垃圾回收篇
虚拟机栈

也就是我们常说的线程方法栈。大致符合所了解的先入后出的栈结构特性,其出入栈的数据结构称为栈帧,也就是调用某个方法A时,则会入栈一个栈帧,这个栈帧结构包括了方法A中的局部变量区、操作数据栈,动态链接、方法的返回地址等。

在JVM栈这个数据区可能会发生抛出两种错误。

1. StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值(大概1M)会抛出这个错误,比如无限递归调用
2. OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误
  • 局部变量区

    局部变量,在方法内声明的变量。其编译期间就确定这个区间的大小。一个局部变量可以保存一个类型为boolean、byte、char、short、int、float、reference和returnAddress类型的数据。reference类型表示对一个对象实例的引用。returnAddress类型是为jsr、jsr_w和ret指令服务的,目前已经很少使用了

  • 操作数栈

    也是先入后出,当一个方法刚刚开始执行时,其操作数栈是空的,随着方法执行和字节码指令的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈/入栈操作。一个完整的方法执行期间往往包含多个这样出栈/入栈的过程

  • 动态连接

    在一个class文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池。

    Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态连接(Dynamic Linking)

    这些符号引用一部分会在类加载阶段或者第一次使用时就直接转化为直接引用,这类转化称为静态解析。另一部分将在每次运行期间转化为直接引用,这类转化称为动态连接

方法A调用方法B的调用过程大致是:方法A存有方法B的在常量池的符号引用b,然后根据指令将符号引用b作为参数,并将b解析为方法B真正所在的内存地址,
直接引用,然后进行方法B真正调用。生成的栈帧就持有了自身方法的引用。

这些符号引用一部分在类加载阶段或第一次使用的时候就被转换直接引用的,就称为静态解析,比如静态方法以及私有方法。在运行期被转换为直接引用的过程称之为动态链接

  • 方法返回地址

    方法退出时(正常return或异常退出),回到方法被调用的位置,并会返回一个值给上层方法(若有的话),并恢复上层方法的执行状态

本地方法栈

当调用原生代码时的方法栈。作用类似于虚拟机栈。
而数据结构、使用方式。都由虚拟机自由发挥

方法区

方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法

程序计数器

程序计数器是一块较小的内存空间,是当前线程执行的字节码的行号指示器。字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令

  • 线程私有(每条线程有独立的计数器)
  • 没有OOM的区域
  • 如执行的是Native方法,则计数器的值为空

其他

JMM

即 Java Memory Model, 这是一个抽象的概念,其模型图如下

img

Java内存模型定义了线程和内存的交互方式,在JMM抽象模型中,分为主内存、工作内存。主内存是所有线程共享的**,Java内存模型规定了所有的变量都存储在主内存中;每条线程还有自己的工作内存,**线程的工作内存中保存了被该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

关注公众号:关大仙的学习笔记

后续高质量文章都会发布到这个公众号上, 还有面试共享群可以添加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值