深入理解JVM虚拟机 第二章 java内存区域与内存溢出异常 2.2 运行时数据区

  • 2.2 运行时数据区
    • 1 概述
    • 2.2.1 程序计数器
    • 2.2.2 Java虚拟机栈
      • 栈帧
        • 1 局部变量表
          • Solt
        • 2 操作数栈
        • 3 动态链接

2.2 运行时数据区

1 概述

运行时数据区

2.2.1 程序计数器

1.pc寄存器(程序计数器)
    可以看做(当前线程的)字节码的行号指示器(.class文件的行号,记住指令运行到哪了)
    每一个java线程都有自己的pc寄存器。
    如果该方法是nativa,那么pc寄存器得值是undefined,如果不是native的,那么pc寄存器就保存jvm正在执行的字节码指令地址。
    程序计数器是唯一一块Java虚拟机规范中没有任何规定的OutOfMemoryError情况的区域;

字节码指令集,由操作码和操作数组成,.java文件编译后的.class就是操作数和操作码的集合


2.2.2 Java虚拟机栈

    Java虚拟机栈:线程私有,这个栈和线程同时创建(生命周期与线程相同),用于存储栈帧;
    是用来描述Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧

void spin(){int i ;for (i = 0;i<100;i++){....}
}

这个方法中,
0,100两个常量存放在操作数栈
整形变量i存放在局部变量变量表

栈帧

    用于存储局部变量表,操作数栈,动态链接,方法出口等信息,每一个方法从被调用到执行完毕,都对应者一个栈帧在虚拟机栈中入栈到出栈的过程。

1 局部变量表

    每个栈帧都包含一组变量列表,称之为局部变量表,用于存储 方法的形参和方法内部定义的变量(局部变量)(这些变量也包括引用类型),和returnAddress(返回地址类型);
这些参数和局部变量都是编译期可知的。
    注意,引用类型的局部变量也会存储在局部变量表中,只不过存储的是引用类型的地址。

    jvm使用局部变量表 完成方法调用时方法的传递
    通过索引来访问,第0个局部变量一定用来存储该实例方法所在对象的引用(this),static修饰的方法除外;

    系统不会为局部变量赋予初始值(实例变量和类变量会被赋予初始值)。也就是说局部变量表不存在类变量那样的准备阶段。

类变量,static修饰的变量

Solt

    局部变量表的容量以变量槽(Slot)为最小单位,其中64位的double和long占用2个连续的solt,访问时访问索引小的solt,
    对于byte、short以及char类型的值在局部变量表之前,会被转换为int。
    因为方法的参数和局部变量,在编译器就已经确定了,所以局部变量表的空间大小在编译器就已经确定。

2 操作数栈

    大小由编译器期决定
    标准的栈运作 ,通过出栈/压栈来访问
    操作数栈存储 常量和变量值
    jvm把局部变量表中或者对象实例中 复制常量和变量值到操作数栈中,jvm也从操作数栈中取出数据和操作数据以及把操作结果重新入栈。
    虚拟机在操作数栈中存储数据的方式和在局部变量区中是一样的,对于byte、short以及char类型的值在压入到操作数栈之前,也会被转换为int。

3 动态链接

一个引用,(当前方法所在类型的)运行时常量池的引用

好文推荐
https://blog.csdn.net/a616413086/article/details/51272309
https://zhuanlan.zhihu.com/p/45354152

java运行时数据区、程序计数器(pc寄存器)、Java虚拟机栈、栈帧、局部变量表、操作数栈相关推荐

  1. Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……

    目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...

  2. Java运行时数据区及对象的分配

    一.Java运行时数据区 简图: 简述: 堆.方法区是线程共享的,虚拟机栈.程序计数器.本地方法栈是线程私有的,一个线程一份. 虚拟机栈的基本单位是栈帧,一个方法的开始执行意味着一个栈帧进栈,一个方法 ...

  3. JVM从入门到精通(五): Java运行时数据区和常用指令

    JVM Runtime Data Area and JVM Instructions Java运行时数据区以及JVM指令 i=i++结果为8 i=++i结果为9 一个class的生命周期 以下面的规范 ...

  4. Java虚拟机2:Java 运行时数据区

    前言快速到底 如果有人问你 java 的内存区域分为哪些,可能很多人会说:堆.栈.方法区--.我个人理解从开发者的角度 Java 能够涉及到"内存区域"的大致有两处:第一,java ...

  5. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析

    文章目录 前言 一.JVM 指令逐条解析 1.Java 代码 2.Java 虚拟机指令 3.分析 JVM 指令 4.局部变量表 与 操作数栈 二.方法出口 前言 " 栈帧 " 中存 ...

  6. java多线程内存隔离_JVM之Java运行时数据区(线程隔离区)

    JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native Met ...

  7. JVM(Java虚拟机模型、Java运行时数据区模型)

    一.Java代码运行原理 .java编译变成.class文件. 类加载器把.class字节码文件加载到JVM中. JVM中的字节码执行引擎从指定的main()方法开始执行代码. 二.类被加载的时机 代 ...

  8. JVM_03 运行时数据区 [ 程序计数器+本地方法栈 ]

    一. 程序计数器 ①. 作用,是用来存储指向下一条指令的地址,也即将要执行的指令代码.由执行引擎读取下一条指令 ②. 特点:①. 是线程私有的 ②. 不会存在内存溢出 ③. 注意:在物理上实现程序计数 ...

  9. 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

    我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了.相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开"运行时数据区"的 ...

  10. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

最新文章

  1. 0、Spring 注解驱动开发
  2. 【区块链与未来】区块链技术将重塑我们的世界
  3. 神马搜索如何提升搜索的时效性?
  4. 无废话WCF系列教程 -- 李林峰
  5. 【最新合集】编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞
  6. CSS一些实用的技巧
  7. 总结css中单位px和em,rem的区别
  8. py编程技巧-2.5-如何在一个for语句中迭代多个可迭代队象(并行串行)?
  9. defaultlib library conflicts with use of other libs; use /NODEFAULTLIB:library
  10. sql \n 查询_探索SQL查询提示选项(快速N)
  11. 关于asp.net上传图片自动生成缩略图
  12. STC12C5A60S2片内存储器介绍
  13. mysql base dir_install_mysql57.sh
  14. 优秀的基于VUE移动端UI框架合集
  15. XcodeGhost简单查看
  16. 偏微分方程数值解---学习总结(2)
  17. 计算机设计大赛南京邮电大学,喜讯:我校信息学子在中国大学生计算机设计大赛中再创佳绩...
  18. java中的约瑟夫问题_java实现约瑟夫问题
  19. C#编程学习27: C#操作Excel从入门到精通
  20. XGboost和GBDT的异同

热门文章

  1. mysql将表按某一列排序更新_mysql根据时间排序,更新某字段值
  2. c语言串口接收的字符转int,从串口发送和接收int值
  3. php getter,对象访问器 getter和setter
  4. java 计划任务_Java实现定时任务的几种方案
  5. 阿里云云计算 7 ECS的产品优势
  6. 人工智能中的深度结构学习 Learning deep architectures for AI - Yoshua Bengio
  7. 算法: 用队列Queue实现栈Stack
  8. ajax jq 图片上传请求头_前端常见面试 请求篇
  9. 1-n整数中1出现的次数
  10. java打开文件对话框