Java虚拟机运行时数据区包括PC寄存器、Java虚拟机栈、Java堆、方法区、本地方法栈、运行时常量池六个部分。

1. PC寄存器

PC寄存器(又叫程序计数器,Program Counter Register),每一条Java虚拟机线程都有自己的PC寄存器。PC寄存器报错当前正在执行方法的字节码指令地址;如果当前方法是native的,则PC寄存器的值为undefined。

2. Java虚拟机栈

Java虚拟机栈(Java Virtual Machine Stack),每一条Java虚拟机线程都有自己私有的Java虚拟机栈,用于存储栈帧。

2.1 栈帧

栈帧(Frames)一种数据结构,用于存储局部变量和部分过程结果,也用于处理动态链接(Dynamic Linking)、方法返回值、异常分派(Dispatch Exception)。
栈帧随方法的调用创建,随方法的结束销毁(方法正常完成,抛出在方法内未捕获的异常都算做方法结束)。

每个栈帧拥有自己的局部变量表(Local Variables)、操作数栈(Operand Stack)和指向当前方法所属的类的运行时常量池的引用。

一个线程只有目前执行的方法的栈帧是活动的。这个栈帧就是当前栈帧,这个栈帧对应的方法就是当前方法,定义这个方法的类就是当前类。

当前栈帧正常执行完成后,还需要恢复调用者状态,包括调用者的局部变量表、操作数栈、和被正确增加过来表示执行了该方法调用指令的程序计数器等。

2.1.1 局部变量表

局部变量表(Local Variables)的长度由编译期决定,并存储在类或接口的二进制表示中--通过方法的Code属性保存并提供给栈帧使用。

一个局部变量可以保存类型为boolean、byte、char、short、float、reference和returnAddress的数据;两个局部变量可以保存类型为long、double的数据。

局部变量表通过索引访问,索引值从0开始。long或double占用两个连续的局部变量,使用较小的索引值来调用。当调用实例方法时,第一个局部变量(索引值0)用来存储被调用方法的对象引用(即this)。

2.1.2 操作数栈

操作数栈(Operand Stack)是一个后进先出(Last-In-First-Out)栈。操作数的长度由编译期决定,也存储在类或接口的二进制表示中,通过方法的Code属性保存并提供给栈帧使用。

操作数栈所属的栈帧在刚刚被创建时,操作数栈是空的。每个操作数栈的成员(Entry)可以保存一个Java虚拟机定义的任意数据类型的值,long和double也保存在一个成员中,成员是一个操作单位,但并不是一个存储单位,一个long或double类型的数据会占用两个单位的栈深度,其他数据类型占用一个。

在操作数栈中,一项运算常由多个子运算嵌套进行,一个子运算的过程的结果可以被其他外围运算使用。

2.1.3 运行时常量池的引用

每个栈帧都包含一个纸箱运行时常量池的引用,用于支持当前方法的代码实现动态链接(Dynamic Linking)。在Class文件中,描述一个方法调用了其他方法或者访问其成员变量是通过符号引用(Symbolic Reference)来表示的,动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。

3. Java堆

Java堆(Heap)是线程共享的,跟随Java虚拟机的生命周期。所有类实例和数组对象存储在堆中。

4.方法区

方法区(Method Area)是线程共享的,跟随Java虚拟机的生命周期。用于存储每一个类的结构信息,如运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法(类或接口初始化方法<clinit>、实例初始化方法 <init>)

方法区是堆得逻辑组成部分,但是虚拟机可以不对这个区域进行垃圾回收(GC)。

5.运行时常量池

运行时常量池(Runtime Constant Pool)是每一个类或接口的常量池(Constant_Pool) [1],常量池保存了数值字面量、方法或字段的符号引用等。

每一个运行时常量池都分配在Java虚拟机的方法区中,在类或接口被加载到虚拟机后,对应的运行时常量池就被创建出来。

6.本地方法栈

本地方法栈(Native Method Stack)用来支持native方法的执行。和Java虚拟机栈类似也是跟随线程的生命周期。


  1. 常量池待详细整理

JVM之运行时数据区的更多相关文章

  1. JVM入门——运行时数据区

    这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...

  2. 深入理解JVM(2)——运行时数据区

    1.运行时数据区 1.1.程序计数器 记录当前线程正在执行的字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空. 1.2.虚拟机栈 每个 Java 方法在执行的同时会创建一个栈 ...

  3. jvm理论-运行时数据区

    三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...

  4. JVM虚拟机-运行时数据区概述

    目录 运行时数据区域 总览 概念扫盲 什么是栈帧(Stack Frame) JVM常见出现两种错误 程序计数器 虚拟机栈 结构 局部变量表 方法是如何调用的 本地方法栈 堆 浅堆和深堆 堆的细分 方法 ...

  5. 【JVM第四篇--运行时数据区】堆

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...

  6. 【转】Java运行时数据区简介及堆与栈的区别

    理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...

  7. Java 运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  8. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  9. Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

随机推荐

  1. Springboot- Spring缓存抽象学习笔记

    Spring缓存作用准备: 1.准备数据(准备一个有数据的库和表/导入数据库文件,准备好表和表里面的数据) 2.创建javaBean封装数据 3.整合MyBatis操作数据库( 这里用MyBatis) ...

  2. 查询相应的key

    一.key pattern 查询相应的key (1)redis允许模糊查询key 有3个通配符  *.?.[] (2)randomkey:返回随机key (3)type key:返回key存储的类型 ...

  3. yii2: 点击编辑后,左侧的连接(a.navtab)失效,变成在新窗口打开

    如:图一 使用a.navtab的时候,点击[自定义回复]->右侧列表,随便编辑一个,完成后 图二: 再点击,左侧的菜单,打开iframe就会失败,直接在新窗口打开.源代码如下: 造成这样的原因是 ...

  4. 在Windows Server 2012上安装SharePoint 2010 SP1

    现在很多企业的系统都开始用上了Windows 2012,最近公司需要建立一个门户系统,一开始就想到了微软的SharePoint2010,这玩意确实非常强悍,2008已经褪去,当然直接在Windows ...

  5. 分享知识-快乐自己:MYSQL之內链接 左链接 右链接 区别

    MYSQL中可以通过内外键链接,将有关系的表中数据合并到一起进行条件筛选: 首先创建两个新表,数据如下: student 表数据: score 表数据: 可以看到students表中stu_id为16 ...

  6. 安装(解密)win10 10074 esd 更新 10162 esd

    最新ESD:http://ms-vnext.net/Win10esds/ 公开下载:http://ms-vnext.net/Win10esds/urls/ ----------------更新 --- ...

  7. python:webbrowser

    import webbrowser webbrowser.open_new_tab('www.baidu.com')

  8. Swagger实践和总结

    Swagger学习和实践 最近安装并使用了一下Swagger-ui.Swagger-editor和Swagger-codegen,感觉还不错. Swagger 是一个规范和完整的框架,用于生成.描述. ...

  9. jenkins-启动和关闭服务

    笔者没有把Jenkins配置到tomcat中,每次都是用命令行来启动Jenkins.但是遇到一个问题:Jenkins一直是开着的,想关闭也关闭不了.百度了一些资料,均不靠谱(必须吐槽一下百度).于是进 ...

  10. ng json格式的序列化和反序列化

    ng中自带方法 angular.toJson 序列化angular.fromJson 反序列化 结果: 代码: <!DOCTYPE html> <html ng-app=" ...