java 内存模型程序计数器和虚拟机栈
文章目录
- 一、程序计数器
- 二、虚拟机栈
java程序运行过程中会把它所管理的区域划分不同的数据区域,其中包括方法区、虚拟机栈、本地方法栈、堆、程序计数器。
一、程序计数器
程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器
;在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。摘自 周志明版 《深入理解java虚拟机》 P39
简单的理解就是是程序计数器保证了程序的正常执行 。
程序计数器特点 :
1.线程私有
2.生命周期是随线程启动而启动,线程消亡而消亡、
3.是java虚拟机规范里面, 唯一 一个 没有规定任何 OutOfMemoryError 情况的区域
程序计数器,可以看做是当前线程执行的字节码的 行号指示器 ,这句话;要理解这句话,需要先知道字节码文件长什么样子,看下面的代码
public class Hello
{public void say(){Hello he = new Hello();System.out.println("hello world");}
}
Hello类的字节码为:
public class Hello {public Hello();Code:0: aload_01: invokespecial #1 4: returnpublic void say();Code:0: new #2 // class Hello3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: getstatic #4 11: ldc #5 // String hello world13: invokevirtual #6 16: return
}
代码中0、3、4、7等的就是字节码指令的偏移地址,偏移地址对应的bipush 等等是jvm 中的操作指令,这是入栈指令。执行到方法say()时在当前的线程中会创建相应的程序计数器,在计数器中为存放执行地址 0 3 4…等等。
这也说明在我们程序运行过程中计数器中改变的只是值,而不会随着程序的运行需要更大的空间,也就不会发生溢出情况。
二、虚拟机栈
java虚拟机栈特点:
1、Java 虚拟机栈(Java Virtual Machine Stacks)是线程私有的,生命周期随着线程,线程启动而产生,线程结束而消亡。
2、Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧。线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法返回地址、附加信息等信息。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈(压栈)到出栈(弹栈)的过程。
3、Java 虚拟机规范即允许 Java 虚拟机栈被实现成固定大小(-Xss),也允许通过计算结果动态来扩容和收缩大小。如果采用固定大小的 Java 虚拟机栈,那每个线程的 Java 虚拟机栈容量可以在线程创建的时候就已经确定。
Java 虚拟机栈会出现的异常
1、如果线程请求分配的栈容量超过了 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出 StackOverflowError 异常。
2、如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将抛出一个 OutOfMemoryError 异常。
Java 虚拟机栈执行过程
可参考文章:https://blog.csdn.net/azhegps/article/details/54092466
java 内存模型程序计数器和虚拟机栈相关推荐
- jvm(12)-java内存模型与线程
[0]README 0.1)本文部分文字描述转自"深入理解jvm",旨在学习"java内存模型与线程" 的基础知识: [1]概述 1)并发处理的广泛应用是使得 ...
- 20191209知乎之Java内存模型(JMM)总结
Java内存模型(JMM) 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范. Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM ...
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...
- C语言内存模型的栈帧,java内存模型(线程独占部分)
线程独占部分 1.你了解Java的内存模型吗? 内存简介 有内核空间.用户空间(java是运行在用户空间上) 32位系统--->最大的访问内存大小是4G 62位系统--->最大的访问内存大 ...
- java虚拟机jvm与Java内存模型(JMM)
Java内存模型(JMM) Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存.Java 内存模型(JMM) 抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存 ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- JVM(一)JVM虚拟机内存结构 和 JAVA内存模型(JMM)
本文转自:浅析java内存模型--JMM(Java Memory Model) - 路易小七 - 博客园,尊重作者,转载请注明出处~ JVM虚拟机内存结构 和 JAVA内存模型 是两个不同的概念 JV ...
- 深入理解JVM虚拟机(十):Java内存模型与多线程
1. 硬件的效率与缓存一致性 由于存储设备和处理器运算速度之间的存在巨大的差异,现在计算机系统在内存与处理器之间加入高速缓存来作为处理器与内存之间的缓冲.将处理器需要的数据复制到缓存中,让处理器可以快 ...
- 深入理解Java虚拟机(第三版)-13.Java内存模型与线程
13.Java内存模型与线程 1.Java内存模型 Java 内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到主内存和从内存中取出变量值的底层细节 该变量指的是 实例字 ...
最新文章
- 腾讯大数据平台,要“没人管”了
- POJ 3177 Redundant Paths (边双连通+缩点)
- jQuery选中该复选框来实现/全部取消/未选定/获得的选定值
- 【原】lua的table深拷贝
- android 自动补全方法,# AndroidStudio代码块的自动补全
- windows API 菜鸟学习之路(三)
- 利用Delphi编写Socket通信程序
- checkstyle配置文件说明
- 基于用户的协同过滤推荐算法研究
- Visual Studio Code启动时提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”信息的解决办法
- 前端快速上手APICloud App开发
- mysql远程备份_mysql实现自动远程备份一办法
- jzoj 3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll) (Standard IO)
- 【笔记】C++之SLT的常用容器
- 快速理解Raft之日志复制(肝了两千五百字)
- 51 Best DevOps Tools for #DevOps Engineers
- 《算法笔记》胡凡第二章笔记
- 2022夏暑假每日一题(八)
- 如何使用 R 从 Internet 下载文件
- 怎样判断安装的mysql是社区版还是企业版
热门文章
- linux tar压缩包目录,如何在Linux上使用tar命令解压和压缩文件
- java atomiclong 使用_java并发:原子类之AtomicLong
- python学习系列day4-python基础
- julia(6)-循环与猜数字
- vb.net2019-多线程并行计算(3)
- 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林
- 免费直播公开课 | 图卷积神经网络, BERT, 对话生成,知识图谱
- 【技术干货】浅析State-Thread
- 【转】numpy-array自带的迭代器-----np.nditer
- 11.10/11.11/11.12 安装PHP5 11.13 安装PHP7