java虚拟机内存分布
java虚拟机内存分布
Java虚拟机在执行java程序的过程中会把它所管理的内存划分为如下若干个不同的数据区域。
1.程序计数器
程序计数器是线程私有的,它占用的空间相对较小,用来记录当前线程字节码执行到哪一步。字节码解释器通过改变这个计数器的值来获取当前线程下一步需要执行的指令,以此来确保在多条线程相互切换之后还能正确的回到切换之前执行的那一步指令。
需要注意的是如果当前线程正在执行的是一个Java方法,那么程序计数器记录的就是正在执行的虚拟机字节码指令的地址;如果当前线程正在执行的是本地(Native)方法,那此时程序计数器的值为空(Undefined)。
并且程序计数器所在的内存区域是在《java虚拟机规范》中唯一一个没有规定任何OutOfMemory Error情况的区域。
2.堆
Java堆(Java Heap)是虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。Java堆的目的就是为了存放Java对象,几乎所有的Java对象实例都在Java堆中分配内存。java堆是垃圾收集器工作的主要区域。
Java堆既可以被设置为固定大小,也可以被设置为可扩展的(通过参数-Xmx和-Xms设定)。如果在堆中没法完成实例分配,且堆也不能在扩展时,就会抛出OutOfMemoryError异常。
- “-Xmx” 用于设置堆的起始内存
- “-Xms” 用于设置堆的最大内存
3.方法区
方法区(Method Area) 与Java堆一样是线程共享的区域,它用于存储已被Java虚拟机加载的类型信息、常量、静态变量。即时编译器编译后的代码缓存等数据。
如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
3.1运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量 一定只有编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,如String类的 intern()方法。
当常量池无法再申请到内存时会抛出OutOfMemoryError异常。
4.虚拟机栈
虚拟机栈(Java Virtual Machine Stack)是线程私有的,它的生命周期和线程一样。虚拟机栈是描述java方法执行的线程内存模型,每个方法被执行是都会创建一个栈帧(Stack Frame),用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从被调用到执行完毕的过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
如果线程请求的栈深度大于虚拟机所允许的深度,将会抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存时,会抛出OutOfMemoryError异常。
4.1栈帧
栈帧包括局部变量表、操作数栈、动态链接、方法出口等。
-
局部变量表(LocalVariables)
用来存放编译器可知的各种Java虚拟机数据类型,包括基本数据类型(boolean、byte、char、short、int、 float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始 地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。
这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,64为的long和double类型的数据会占用两个槽,其余的数据类型都只占用一个槽。如果执行的是实例方法(没有被static修饰的方法),那局部变量表中第0位索 引的变量槽默认是用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问到这个隐 含的参数。
在Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方 法所需分配的局部变量表的最大容量。
局部变量表所需的空间在编译期间完成分配,在进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在运行期间不会改变局部变量大小(即槽的数量)。这其中还包含了槽的复用问题。
public void Test(int a){if(a<0){String b="";//。。。。}int c=0;//..... }
就以上这个Test方法来说,代表本方法的this变量占一个槽位,int类型的变量a占一个槽位,String类型的变量b占一个槽位,int类型的c占一个槽位,那么总共应该是有四个槽位,也就是局部变量表的最大槽数应该为4,但是我们看他的槽位显示只有三个。
我们再来看他的槽位详细信息,
可以看到确实只有三个,分别是this变量,a和c。在我们的代码中明明定义了String类型的b变量,但是在槽位中却没有体现,这其实就是槽位的复用问题。对于作用域比较小的变量,在他完成自己的使命后,若是之后还有变量需要使用槽位,就会使用这个已经完成使命的变量的槽位,所以这里的第三个槽位中的变量是c而不是b。
- 操作数栈
操作数栈(Operand Stack)也常被称为操作栈,它是一个后入先出(Last In First Out,LIFO) 栈。同局部变量表一样,操作数栈的最大深度也在编译的时候被写入到Code属性的max_stacks数据项 之中。操作数栈的每一个元素都可以是包括long和double在内的任意Java数据类型。
当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种 字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作。如整数加法的字节码指令iadd,这条指令在运行的时候要 求操作数栈中最接近栈顶的两个元素已经存入了两个int型的数值,当执行这个指令时,会把这两个int 值出栈并相加,然后将相加的结果重新入栈。
-
动态链接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接(DynamicLinking)。Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池里指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析。另外一部分将在每一次运行期间都转化为直接引用,这部分就称为动态链接。
-
方法返回地址
当一个方法开始执行后,只有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法 返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者(调用当前方法的方法称为调用 者或者主调方法),方法是否有返回值以及返回值的类型将根据遇到何种方法返回指令来决定,这种 退出方法的方式称为“正常调用完成”(Normal Method Invocation Completion)。
另外一种退出方式是在方法执行的过程中遇到了异常,并且这个异常没有在方法体内得到妥善处 理。无论是Java虚拟机内部产生的异常,还是代码中使用athrow字节码指令产生的异常,只要在本方 法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方法的方式称为“异常调用 完成(Abrupt Method Invocation Completion)”。一个方法使用异常完成出口的方式退出,是不会给它 的上层调用者提供任何返回值的。
无论采用何种退出方式,在方法退出之后,都必须返回到最初方法被调用时的位置,程序才能继 续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层主调方法的执行状态。 一般来说,方法正常退出时,主调方法的PC计数器的值就可以作为返回地址,栈帧中很可能会保存这 个计数器值。而方法异常退出时,返回地址是要通过异常处理器表来确定的,栈帧中就一般不会保存 这部分信息。
5.本地方法栈
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。
《Java虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规 定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如Hot-Spot虚拟机)直接 就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失 败时分别抛出StackOverflowError和OutOfMemoryError异常。
相关文章:
![](https://img-blog.csdnimg.cn/765b18b290c24d088a442e01f0da2d0a.png#pic_center)
java虚拟机内存分布
java虚拟机内存分布 Java虚拟机在执行java程序的过程中会把它所管理的内存划分为如下若干个不同的数据区域。 1.程序计数器 程序计数器是线程私有的,它占用的空间相对较小,用来记录当前线程字节码执行到哪一步。字节码解释器通过改变这个计数器的值来获…...
![](https://img-blog.csdnimg.cn/img_convert/8b5118c14c000da6395854d015821d72.png)
最完整的小红书带货笔记——垂直模式
最完整的小红书带货笔记——垂直模式,小红书直播复盘怎么做?#直播带货笔记 第1篇,带你解锁直播复盘5大要点! #小红书店铺#小红书运营 小红书怎么发带货笔记? 做小红书带货的同学注意了,我们带货一定要发笔…...
![](https://img-blog.csdnimg.cn/11cc9714dc7f43b4864d3495fd5823c6.png)
SpringBoot实战——个人博客项目
目录 一、项目简介 二、项目整体架构 数据库模块 后端模块 前端模块 三、项目具体展示 四、项目的具体实现 1、一些准备工作 🍎数据库、数据表的创建 🍎设置数据库和MyBatis的配置 🍎将前端项目引入到当前项目中 2、登录注册模块 &…...
![](https://img-blog.csdnimg.cn/4ca79dc93b774435af6bedf66a7b7b0c.png)
浅谈Spring中事务管理器
由于事务部分代码在设计上整体比较简单,我自己觉得它在设计上没有什么特别让我眼前一亮的东西,所以下文更多的是侧重执行流程,能理解事务管理器等一众概念以及相关的变量含义,真正遇到Bug会调试,知道在什么地方打断点就…...
![](https://img-blog.csdnimg.cn/d1481332314d490e8895e410b0456b86.png)
Python练习系统
用python给自己做个练习系统刷题吧! #免费源码在文末公众号哈# 选择题 def xuanze():global flag2if flag21:def insert():numvar1.get()questionvar2.get()choicevar3.get()answervar4.get()with open(d:\\练习系统\\练习三3.1.pickle,rb) as file:lst1pickle.lo…...
![](https://img-blog.csdnimg.cn/c9f379d2622f4d0884323026dae256bf.png)
Transformer学习笔记1
Transformer学习笔记1 翻译中,每个词翻译时更看重哪个原词? ## 注意力机制的一般性原理 典型的注意力机制 hard one-hot形式,但是太过专一 soft 都分布,但是太过泛滥 local attention 自注意力机制:self-atte…...
![](https://img-blog.csdnimg.cn/7526463afb1343beb3c0eb5bbca5ffb0.webp)
软件测试简历个人技能和项目经验怎么写?(附项目资料)
目录 前言 个人技能 项目实战经验 项目名称:苏州银行项目(webapp) 项目描述: 项目名称:中国平安项目(webapp) 项目描述: 项目名称:苏宁易购项目(webapp&a…...
![](https://img-blog.csdnimg.cn/57305991ed814108be8c34fee6f7221d.png)
C语言运算符优先级和结合性一览表
所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁。 运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符()和逗号运算符 简单记就是:! > 算术运…...
![](https://www.ngui.cc/images/no-images.jpg)
Java8介绍
Java 8 Java 8 把函数式编程里的一些思想融入到 Java 的语法中,让我们可以用更少的时间写出高效的代码。 Java 8的优势: 代码行更少Lambda表达式Stream API便于并行减少空指针JVM优化兼容老版本 Lambda Lambda表达式是一段可以传递的代码࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
Java 基准测试
Java 基准测试maven依赖简单使用执行多个函数BenchmarkMode(Mode.AverageTime) 运行模式OutputTimeUnit(TimeUnit.NANOSECONDS) 报告结果时间单位Warmup(iterations 5,time 1,timeUnit TimeUnit.SECONDS) 预热参数Measurement(iterations 5,time 1,timeUnit TimeUnit.SEC…...
![](https://www.ngui.cc/images/no-images.jpg)
普通护照出国免签及落地签国家和地区
1.互免签协议的国家(双向免签) 序号 协议国 限制条件 生效日期 1 阿联酋 停留不超过30天 2018.01.16 2 巴巴多斯 停留不超过30天 2017.06.01 3 巴哈马 停留不超过30天 2014.02.12 4 白俄罗斯 停留不超过30天 2018.8.10 5 波黑 停留不超…...
![](https://img-blog.csdnimg.cn/a688e2fa3ff542e48fd8b2e08bda2641.png)
20230219 质心和重心的区别和性质
质心:(无需重力场的前提)所有质点的位置关于它们的质量的加权平均数。 重心:(需要重力场的前提)重力对系统中每个质点关于重心的力矩之和为零。 质心: xˉ∑i1nmixi∑i1nmi,yˉ∑i1nmiyi∑i1nmi…...
![](https://img-blog.csdnimg.cn/img_convert/d263f63b04406f9d30e443a45b4a2cd0.png)
maven多环境配置
maven多环境配置 参考网址: https://mp.weixin.qq.com/s/-e74bd2wW_RLx7i4YF5M2w https://mp.weixin.qq.com/s/3p53kBHqys58QdMme6lR4A 项目地址 https://gitee.com/shao_ming314/maven-profile-dir 项目说明 该项目基于目录进行多环境配置 , 具体的配置文件在 src/resource…...
![](https://img-blog.csdnimg.cn/img_convert/fc47ca9de303a14ae7236e77d12fab9d.png)
设计模式之中介模式与解释器模式详解和应用
目录1 中介模式详解1.1 中介模式的定义1.1.1 中介者模式在生活场景中应用1.1.2 中介者模式的使用场景1.2 中介模式的通用实现1.2.1 类图设计1.2.2 代码实现1.3 中介模式应用案例之聊天室1.3.1 类图设计1.3.2 代码实现1.4 中介者模式在源码中应用1.4.1 jdk中Timer类1.5 中介者模…...
![](https://www.ngui.cc/images/no-images.jpg)
2023年全国最新交安安全员精选真题及答案1
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题: 1.对施工组织设计中的安全技术措施或者专项施工方案是否…...
![](https://www.ngui.cc/images/no-images.jpg)
chrome插件开发备忘录
文章目录前言要点通信方式注意事项参考前言 第一次接触到插件开发,起因是我用了十多年的一键上传需要升级了。之前的版本来自于有道云,是通过在书签栏加一个书签,然后将上传功能注入到当前页面的方式来实现的。一直也用得挺好,挺…...
![](https://img-blog.csdnimg.cn/570729ab6b7149d5ba7de76a9a1777d7.png)
实例1:控制树莓派板载LED灯闪烁
实例1:控制树莓派板载LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派。通过对树莓派板载LED灯的状态读写控制,熟悉树莓派本身的操作及Linux中文件的读写。掌握常见函数time.sleep(…...
![](https://www.ngui.cc/images/no-images.jpg)
华为OD机试题 - 最大排列(JavaScript)
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...
![](https://img-blog.csdnimg.cn/1f5f143393a147efb465ce0c98bc90b5.jpeg)
手动创建 vue2 ssr 开发环境
本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦,因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说,很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…...
![](https://www.ngui.cc/images/no-images.jpg)
RHCE-操作系统刻录工具
Windows 1.准备材料。 一个可用的windows操作系统(下载的时候用迅雷比较快) MSDN, 我告诉你 - 做一个安静的工具站 大于等于8G的U盘 想要安装的系统光盘镜像 U盘烧录工具(软碟通) UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 …...
![](https://img-blog.csdnimg.cn/a79c496c9a8346bdabbfc3b16f57681f.png)
PHP面向对象01:面向对象基础
PHP面向对象01:面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...
![](https://img-blog.csdnimg.cn/img_convert/3be3ed4db6f14fc458bf9c633213748a.png)
《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url。URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL的索引、视图
什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放,但不能独立存在,必须属于某个表 由数据库自动维护,表被删除时,该表上的索引自动被…...
![](https://img-blog.csdnimg.cn/ababa629e028422aa72584ae6146c78a.png)
【JavaWeb】网络层协议——IP协议
目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本:就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度:单位是4字节。于TCP首部长度完全一致,也是可变的&…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python学习笔记】41.Python3 多线程
前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理…...
![](https://img-blog.csdnimg.cn/img_convert/3ebfc82605c06357dff744b8548bcd00.png)
Windows 版本ffmpeg编译概述
在使用ffmpeg过程当中,ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可,Android需要交叉编译,在windows就比较麻烦,庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库(http://ffmpeg.org/download.html#b…...
![](https://img-blog.csdnimg.cn/d09e7ef7680f4bd8a19d93c5446ed267.png)
NETCore下CI/CD之自动化测试 (详解篇)
NETCore下CI/CD之自动化测试 (详解篇) 目录:导读 前言 安装JDK 安装 Tomcat 首先,我们需要指定 Tomcat.PID 进程文件,进入 /usr/local/tomcat/bin,编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...
![](https://www.ngui.cc/images/no-images.jpg)
Hoeffding不等式剪枝方法
在基于物品的协通过滤算法中,当用户历史行为数据有很多时,对计算会有很大挑战,对此可以使用剪枝对数据进行化简来达到减少计算量。 不是每个物品对都需要进行增量计算。对于两个物品的相似度,每次更新都能够得到一个新的相…...
![](https://www.ngui.cc/images/no-images.jpg)
【算法】数组中的重复数字问题
数组中的重复数据 数组中重复的数字 错误的集合 以第三题,错误的集合为例 对于这样的问题,有很简单的解决方式,先遍历一次数组,用一个哈希表记录每个数字出现的次数,然后遍历一次 [1…N],看看那个元素重…...
![](https://img-blog.csdnimg.cn/c4e978b23a6d448b9e89f3d7ee98e3da.png)
数值方法笔记2:解决非线性方程
1. 不动点定理及其条件验证2. 收敛阶、收敛检测与收敛加速2.1 如何估计不动点迭代的收敛阶xk1g(xk){x}_{{k}1}{g}\left({x}_{{k}}\right)xk1g(xk)2.2 给定精度的情况下,如何预测不动点迭代需要迭代的次数2.3 如何加快收敛的速度2.4 停止不定点迭代的条件2.5 不动…...
![](/images/no-images.jpg)
windows 做网站服务器/抖音seo是什么
再有五六天就开学了,查找有关搜索引擎排名,以下这篇文章还是比较不错的,先赞一个^_^!搜索引擎排名定义: 在搜索引擎里输入一个关键字,通常得到很多搜索结果,这些搜索结果的排名有先后之分,这…...
展示型手机网站模板/资源搜索
• 描述使用ASM 的好处• 管理ASM 实例• 创建和删除ASM 磁盘组• 扩展ASM 磁盘组• 通过使用各种实用程序检索ASM 元数据Automatic Storage ManagementAutomatic Storage Management (ASM) 将文件系统与卷管理器纵向集成在一起,这是一项专门为Oracle DB 文件建立的…...
![](https://yqfile.alicdn.com/fab1a2b29fed9792f06ff13dcd26b21d2de9b3c9.png)
新版wordpress增加备案/一键识图找原图
锤子“坚果手机”发布会因故推迟、PPT一堆错漏、抢红包故障,据悉是因锤子官网服务 器遭遇了数十G流量DDoS恶意攻击,现场PPT也是临时赶制、边写边用。关于DDoS攻击(分布式拒绝服务),Akamai技术公司也发布了二季度的互 联…...
![](https://img-blog.csdnimg.cn/20190804210711568.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjIwNTc3Ng==,size_16,color_FFFFFF,t_70)
怎样做网站内链/宁德市人民医院
转:https://blog.csdn.net/u013673437/article/details/80534839 在编写MATLAB程序过程中,有时会遇到当程序运行到不满足if条件时让程序跳出,停止运行的情况,在MATLAB中,使用return语句实现程序跳出。 只将以上程序中变…...
![](https://s3.51cto.com/wyfs02/M00/1A/57/wKioL1MUpSSAftbDAAFlfT0D8c4906.jpg)
厦门定制网站建设/网络公司名字
关于前端图表开发有很多基于Flash,HTML5,JavaScript的开源组件,而Java开源图表组件JFreeChart也是众所周知,网上关于JFreeChart的资料非常之多,可见其在Java开发中应用的相当广泛。写这篇文章一是为了记录一下关于JFre…...
![](https://img-blog.csdnimg.cn/c1d7268fe3774343b97cac833597cd69.png)
达州网站建设qinsanw/郑州网络营销公司哪个好
这个 Python 库 Text2Human 仅通过提供有关性别和衣服的文本描述来生成一个人的图像。 原始数据集 DeepFashion-MultiModal,具有丰富多模态注释的大规模高质量人体数据集。它具有以下属性: 总共有44,096张高分辨率人体照片,12,701张全身图像。 我们为每张完整的人体图片手…...