JVM运行时数据区(一)
1、名词解释:
栈帧:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。
2、程序计数器:
程序计数器是一块比较小的内存空间,可以将它看作是当前线程所执行的字节码的行号指示器。
由于Java是支持多线程的语言,当运行的线程数超过CPU数量时,线程之间根据CPU时间片轮询抢夺CPU资源,在任意一个时刻,一个处理器(例如一个单核的CPU)都只能执行一条线程中的指令,其他线程都必须被切换出去。因此为了保证每一个线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程之间,程序计数器独立工作,互不影响;所以程序计数器是线程的私有空间。
如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。在Java虚拟机规范中,该区域是没有规定任何OOM(OutOfMemoryError在以后的文章中都将使用OOM来表示OutOfMemoryError)的区域。
3、Java虚拟机栈
Java虚拟机栈与程序计数器一样也是线程私有的内存空间,它随着线程的创建而创建,随着线程的消失而消失;它主要用于存储方法的局部变量、操作数栈、动态链接方法和返回地址等信息。
虚拟机在运行时使用一种叫栈帧的数据结构保存上下文数据。在栈帧中,存放了方法的局部变量表、操作数栈、动态链接方法和返回地址等信息。每一个方法的调用都伴随着栈帧的入栈操作;相同地,方法的返回则伴随着栈帧的出栈操作(这就是传说中的入栈、出栈)。由于局部变量表中存储的是基本数据类型(boolean、byte、int、short、char、float、double、long)、对象的引用(可以理解为一个指针,指向堆内存中的对象)和返回值地址,所以当一个方法的参数和局部变量相对较多时,那么栈帧中的局部变量表就会比较大,栈帧会膨胀以满足方法调用所需传递的信息。在Java虚拟机栈中与性能调优关系最为密切的部分就是局部变量表。局部变量表用于存放方法的参数和局部变量。其中long与double占用8个字节(64位),int和float占用4个字节,short和char占用2个字节,byte占用1个字节,boolean占用1位(虚拟机按1个字节进行处理)。在方法执行时,虚拟机使用局部变量表完成方法的传递,对于非static方法还会将当前对象this作为参数通过局部变量表传递给当前方法。
Java虚拟机规范允许,Java栈的大小是动态的或者固定的。在java虚拟机规范中,对该区域定义了两种异常:StackOverflowError和OOM。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则抛出OOM。
在Java虚拟机中,可以使用-Xss参数来设置栈的大小。栈的大小直接决定了函数调用的可达深度。
JVM运行时数据区(一)的更多相关文章
- Jvm运行时数据区
一:运行时数据区 Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域.这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户 ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- JVM 运行时数据区 (三)
JVM运行时数据区 运行时数据区由 程序计数器.java虚拟机栈.本地方法栈.堆.方法区 组成: 1.程序计数器 每一个Java线程都有一个程序计数器,用于保存程序执行到当前方法的哪一个指令,它是线程 ...
- JVM总结(一):概述--JVM运行时数据区
大三下,趁着寒假重温一遍JVM,准备在一个系列来总价一下学习JVM的整个过程.争取在接下来的一个星期内更新完这一个系列,然后回家过年. JVM运行时数据区 线程私有的数据区 程序计数器 虚拟机栈 本地 ...
- JVM运行时数据区与JVM堆内存模型小结
前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...
- JVM运行时数据区和垃圾回收机制
最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- Java中的字符串常量池和JVM运行时数据区的相关概念
什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...
- JVM运行时数据区及对象在内存中初始化的过程
JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...
- JVM 运行时数据区(二)
@ 目录 运行时数据区 共享区 堆区 方法区 隔离区 虚拟机栈 栈帧 本地方法栈 程序计数器 运行时数据区 JVM 运行时数据区主要分为5块 方法区 JDK1.8以后叫做元数据区(Metaspace) ...
随机推荐
- SCRUM管理之KPI与OKRs结合
以下内容是本人在担任ScrumMaster中的实际应用,供大家交流学习参考. 目录 1绩效考核原则 4 2绩效考核范围 4 3绩效计算 4 3.1KPI 4 3.1.1KPI指标评分表 4 3.1.2 ...
- 【转载】路径双反斜杠!!!Python IDLE或Python shell中切换路径 切换目录os.chdir("C:\\python37\\2019pythonshel37\\diedai")
Python IDLE或shell中切换路径在Python自带的编辑器IDLE中或者python shell中不能使用cd命令,那么跳到目标路径呢.方法是使用os包下的相关函数实现路径切换功能. im ...
- angular使用sass的scss语法
一.现象 为了简写样式 二.解决 1.安装sass ,利用npm 安装(npm工具如果没有,请先自行安装好) (1).npm install node-sass --save-dev (2).npm ...
- phpexcel 使用模板导出报表
function exportExcel($list, $filename, $indexKey = array()){ require_once(getcwd() . '../../app/Libs ...
- ECMA262学习笔记(二)
Property特性:特性用于定义和解释命名属性的状态. ECMAScript建立执行环境: 解释执行全局代码或使用eval函数输入的代码会创建并进入一个新的执行环境.每次调用ECMA脚本代码定义的函 ...
- RDMA RC UC UD
RC:面向连接的可靠服务 UC:面向连接的不可靠服务 UD:面向数据报的不可靠服务 RD:面向非连接(类似UDP)的可靠服务 面向连接 vs 面向数据报 相同点:两者的通信均包括双方QP对的参与 不同 ...
- PHP 利用PHPExcel 文件导入(也可保存到本地或者服务器)、导出
首先需要去官网http://www.php.cn/xiazai/leiku/1491,下载后只需要Classes目录下的文件即可. 1.PHPExcel导出方法实现过程 1 2 3 4 5 6 7 8 ...
- 设计模式学习心得<适配器 Adapter>
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...
- freeMark模板引擎
http://blog.csdn.net/shimiso/article/details/8778793
- 使用kbmmw 实现图形验证码
首先感谢图形验证码的提供者 晴空无彩虹 https://blog.csdn.net/u011784006/article/details/80827181 他用FMX 实现了验证码的生成,我修改成 ...