JVM之运行时数据区
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虚拟机栈类似也是跟随线程的生命周期。
常量池待详细整理 ↩
JVM之运行时数据区的更多相关文章
- JVM入门——运行时数据区
这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...
- 深入理解JVM(2)——运行时数据区
1.运行时数据区 1.1.程序计数器 记录当前线程正在执行的字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空. 1.2.虚拟机栈 每个 Java 方法在执行的同时会创建一个栈 ...
- jvm理论-运行时数据区
三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...
- JVM虚拟机-运行时数据区概述
目录 运行时数据区域 总览 概念扫盲 什么是栈帧(Stack Frame) JVM常见出现两种错误 程序计数器 虚拟机栈 结构 局部变量表 方法是如何调用的 本地方法栈 堆 浅堆和深堆 堆的细分 方法 ...
- 【JVM第四篇--运行时数据区】堆
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.堆的概述 JVM的运行时数据区如下: 一个Java程序运行起来对应着一个进程(操 ...
- 【转】Java运行时数据区简介及堆与栈的区别
理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...
- Java 运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- 面试常问的 Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
随机推荐
- 未能加载文件或程序集 Ninject.Web.Common, Version=3.2.0.0
在Web MVC4中使用NuGet添加NInject.MVC4后,编译报了个警告: 发现同一依赖程序集的不同版本之间存在冲突 然后在运行时就运行到var kernel = new StandardKe ...
- tyvj 1062 合并傻子 区间dp,典型模型石子归并
P1062 合并傻子 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园 ...
- qtjambi_编译
ZC: 写文章时间为 20160716 1. 1.1.在 Win7x64中编译不成功,主要原因是 源码中包含的程序generator.exe出现内存错误 ==> 于是,转到 虚拟机XPsp3中编 ...
- 运行jar_测试代码
1.Eclipse 将 工程 导出成 jar Eclipse --> Export... --> 界面中树状图形中选择" Java下的'JAR file' "(不知道这 ...
- 在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能
在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能 https://www.jianshu.com/p/27ee7df4ccc1
- 注册表操作的几个windows api
(转自:http://blog.sina.com.cn/s/blog_4e66c6cd01000bcu.html) 键管理类: RegCloseKey():关闭注册表键释放句柄. RegC ...
- 本地动态SQL
(转自:http://blog.itpub.net/26622598/viewspace-718134) 一.什么是动态SQL 大多数PL/SQL都做着一件特殊的结果可预知的工作.例如,一个存储过程可 ...
- java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xiaozao_web]]
二月 20, 2017 11:30:28 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...
- SpringCloud教程 | 第十篇: 高可用的服务注册中心
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/art ...
- Django 使用 内置 content-type
django内置的content-type组件, 记录了项目中所有model元数据的表 可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id ...