JVM 运行时数据区域总结
引言
本博客总结自《深入理解 Java 虚拟机》,第二章。
一、概述
Java 虚拟机在执行 Java 程序的时候会把它所管理的内存划分为若干个不同的数据区域。
记忆口诀:两栈一计数,一堆一方法。
解释:第一句两栈分别是VM栈和本地方法栈,一计数指的是程序计数器,它们都是线程私有;后一句,一堆指的是Java堆,一方法指的是方法区,这两个区域是线程共享。
二、程序计数器
程序计数器是一个较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。
在虚拟机的概念模型(实现各有不同)中字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,这与程序的分支、循环、跳转、异常处理、线程恢复等基础功能紧密相关。
在这里,书中提到:
Java 虚拟机的多线程是通过线程轮流切换并分配一个 CPU 内核执行时间的方式来实现的,任何一个时间点,一个CPU 内核都只会执行一条线程中的指令。
正因为这样的线程实现策略,要想在线程切换后恢复到正确的执行位置,这个程序计数器必须是线程私有,独立存储。
程序计数器可以存储两种内容,字节码指令地址或空值。
当线程正在执行的是 Java 方法的时候,存储字节码指令地址,而当执行的是Native 方法的时候,则为空值。
另外,值得注意的是,此内存区域是 JVM 规范中唯一没有规定任何 OOM Error情况的区域。也就是说,如果你的程序突然报了 OutOfMemory Error 错误,那么肯定不是这个区域出了问题。
三、JVM 栈
JVM 栈又称为 Java 虚拟机栈,或 VM 栈。
这块逻辑分区存储的方法调用信息。Java 方法在调用的时候,会在 JVM 栈中创建一个 栈帧(Stack Frame),它会用于存储方法内部所用到的局部变量表、操作数栈、动态链接、方法返回地址等信息。其中最需要程序开发人员关心的是存储局部变量的局部变量表。
方法开始执行,栈帧入栈,方法执行完毕,栈帧出栈,以此来实现线程中方法的调用。
因此,从上面的特征来看, JVM 栈也一定是线程私有的。生命周期与线程相同。
局部变量表,存储编译期可知的基本数据类型变量(double、long 占 2 个 Slot 局部变量空间,其他 1 个)、对象引用、以及 returnType。
局部变量表的内存分配是在编译期间完成分配。当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。
一般情况下 JVM 栈不会轻易抛出异常,但是有一种情况经常会导致 StackOverflowError 异常,就是递归。
递归是一种通过调用方法自身向“基准情况”不断推进的一种算法,但是基准情况的判断无法在编译期给出答案,这就导致了,如果无法在有限的栈深度给出问题的解,方法就会不停地调用自身,从而将 JVM 栈空间占满,那么就会导致 StackOverflowError 异常。但现代的大多数虚拟机都支持动态扩展这块内存区域,但如果连动态申请的内存依然无法满足计算需要,就会报 OutOfMemoryError 异常。
JVM 运行时数据区域总结相关推荐
- 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置
12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...
- JVM运行时数据区域——为什么jdk8用元空间替换了永久代
以局部窥全局,这个问题其实很复杂,要弄清楚这个问题,首先要对JVM运行时数据区域划分以及各个数据区域的作用了和指掌. JVM运行时数据区域总览 JVM在执行Java程序的过程中(简称运行时)会把它所管 ...
- [jvm]运行时数据区域详解
了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...
- JVM学习笔记② JVM运行时数据区域
JVM所管理的内存将会包括以下几个运行时数据区域: 方法区(Method Area) 方法区是各个线程共享的区域,存放类信息.常量.静态变量.即时编译器编译后的代码等数据.虽然Java虚拟机规范把方法 ...
- JVM调优系列:(二)JVM运行时数据区域
1) Method Area 2) Heap 3) Java Stacks 4) PC Registers 5) Native Method Stacks JAVA的JVM的内存模型大致可分为3个区: ...
- JVM运行时数据区域
参考资料 Java Virtual Machine Specification | 2.5. Run-Time Data Areas Java Virtual Machine Specificatio ...
- 一. JVM发展史,运行时数据区域,四大引用
一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...
- Java JVM内存模型(运行时数据区域)详解
详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...
- Java 运行时数据区域,哪些是线程隔离的?哪些又是公有的?
来自:会点代码的大叔 JVM 运行时数据区域大致可以分为:程序计数器.虚拟机栈.本地方法栈.堆区.元空间.运行时常量池.直接内存等区域:就是下面这个样子的: 其中有些区域,随着 JDK 版本的升级不断 ...
最新文章
- signature=65a5d6b0ac441e09ae68e9bbee76cba1,Bortezomib
- arduino项目_quot;Arduino智能车项目quot;实战班开班!
- Eclipse插件打开编辑器
- 用Python调用华为云API接口发短信
- SQLite学习总结(2)——使用Java操作SQLite
- 10.2.0.3.0 oracle导出,oracle 数据库从10.2.0.4升级到11.2.0.3
- JavaScript 高级程序设计 笔记
- INCONEL 600该合金因其强度和耐腐蚀性而广泛用于化学工业
- 如何在 Word 的方框中打勾 √ ?☑ ☒
- 基于FBX SDK的FBX模型解析与加载 -(四)
- 关于长江的题目_高中关于长江的作文题目加优秀范文
- mysql workbench自动备份_MySQL如何自动备份
- 如何查找域名对应IP地址?
- 离职后工作居住证如何办理延期注销
- ffmpeg命令行视频剪辑与拼接
- 函数的callee和caller的区别和用处
- 【STM32H7教程】第91章 STM32H7的FDCAN总线基础知识和HAL库API
- C# EPL USB 指令打印
- 一个生物专业学生的内心独白:我为什么能去互联网大厂?能解剖兔子,手焊PCB,调试FPGA,还能手撕LRU!
- Java业务系统配置管理设计方案实现