JVM学习随笔02——虚拟机内存区组成与内存溢出异常

2023-05-16

一、Java虚拟机内存区组成图

 1、程序计数器:

  • 每个线程独占一个计数器,用来指示该线程下一条要执行的指令的地址。
  • 这一部分不会导致内存异常。
  • PS:如果一个线程进入的是一般的Java方法,计数器指示的是下一条指令地址;如果进入的是Native方法(非Java代码)计数器为空undefined。

2、虚拟机栈:

  • 线程私有,用来存储正在执行的Java方法的局部变量表、连接、方法出口等等信息。一个Java方法从开始执行到执行结束对应一个栈帧入栈到出栈的过程。
  • 局部变量表是虚拟机栈中最主要的部分,局部变量表里存储了线程对应代码编译期间确定下的所有数据类型和对象引用,局部变量表的slot个数编译后就完全确定了,运行期间slot个数不会改变。
  • 如果JVM提前规定了栈深度(可以简单理解为slot个数),线程需要的深度如果大于该值,会爆栈,抛出StackOverflowError异常;
  • 如果JVM栈深度是动态扩展的,那一直到虚拟机栈内存全部用完,然后抛出O.O.M异常。

3、本地方法栈:

  • 和虚拟机栈类似,只不过虚拟机栈为普通Java方法(字节码)服务,本地方法栈为Native方法服务。

4、堆(GC堆、“垃圾堆”):

  • 所有线程共享;存放几乎所有的对象实例;
  • 和前面的栈一样,Java堆既可以是固定大小的,也可以是可扩展的,一般可扩展(对应参数-Xms、-Xmx)。
  • 堆空间不够抛出O.O.M异常。

5、方法区(非堆):

  • 所有线程共享;用来存放一些已经被JVM加载的常量、静态变量等数据。
  • 方法区空间不足时抛出O.O.M异常;

PS:程序中的常量不一定在编译器全部加入运行时常量池,运行过程中产生的常量也可以加入常量池中。代码运行过程中产生常量的例子如:String类的intern()函数,intern()函数在JDK1.7之前和之后以及JDK1.8中好像均有区别,具体内容可以参考博客:字符串的intern()方法--字符串常量池_字符intern_JnHaLee的博客-CSDN博客

6、直接内存:

        资料上说直接内存不属于虚拟机运行时数据区的一部分,不是很理解前面这句话...但能确定的是在根据物理机内存确定JVM所需内存空间时要把这一部分占用的空间也考虑上。

参考资料:《深入理解Java虚拟机:... 第3版》周志明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM学习随笔02——虚拟机内存区组成与内存溢出异常 的相关文章

随机推荐

  • 为什么数组下标是从0开始?可能原因

    也不是所有的高级程序语言都是如此 xff0c 比如Python数组下标就支持负数 原因一 xff1a 历史原因 语言出现顺序从早到晚C Java JavaScript C语言数组下标是从0开始 gt Java也是 gt JavaScript
  • 离线部署docker配置文件

    systemd config cat gt usr lib systemd system docker service lt lt EOF Unit Description 61 Docker Application Container E
  • layui.use里面定义的方法外面怎么调用

    前言 xff1a layui use里面定义的方法外面怎么调用 解决办法 xff1a 方法内部加window 加了window后 可以被外部引用 window uploadData 61 function 源码 xff1a layui us
  • Hadoop(四)HDFS 读写流程

    HDFS 的读写流程 HDFS 将文件切割为默认大小的块 xff08 block xff09 存放在不同的 DataNode上 xff1b 上传文件和读取文件是 HDFS 重要的流程 xff1b HDFS 的写文件流程 图文解释 xff1a
  • cocos2dx3.x中Opacity和visible

    当我们需要场景中的某个精灵不可见时可能会面临两种选择 xff0c 特别地 xff0c 我们可能经常使用Fadein和Fadeout表示淡入淡出的特效 xff0c 而当我调用Fadeout淡出精灵时 xff0c 其实本质上是在对精灵的Opac
  • NLPcc2013-2014微博文本情感分类数据集

    从xml中提取的 xff0c 文件格式为tsv xff0c 和csv差不多 可以转为其他格式 链接 xff1a https pan baidu com s 1lDiuvpbT5qPc uJJs0cPUQ 提取码 xff1a t5i7 spa
  • java面试题2019 自己总结的面试题 javaspring springboot cloud面试题

    java面试题 这些面试题是我搜集的一些和自己之前在面试当中积攒的面试题 有不对的地方 请多指教 讲讲App接口对接 zookeeper 在微服务 xff0c 处于什么角色 xff1f 脏读是什么 xff1f 脏读是读到了别的事务回滚前的脏
  • 解决js、css缓存问题

    对于线上的项目 xff0c 会经常改动 xff0c 并重新发布 xff0c 但是会发现它一些css js并没有实时更新 xff0c 而是使用缓存中的 所以解决方式可以有 xff1a 在引入时 xff0c 给更新频繁的js或css文件加入版本
  • 文献阅读 DeepReflect: Discovering Malicious Functionality through Binary Reconstruction

    其他可参考链接 xff1a DeepReflect xff1a 通过二进制重构标识具体恶意行为 知乎 论文阅读 20 USENIXSec21 DeepReflect xff1a 通过二进制重构发现恶意行为 xff08 恶意代码ROI分析经典
  • 检测恶意软件分类模型中的概念漂移

    科研笔记 论文题目 检测恶意软件分类模型中的概念漂移 共形预测 conformal prediction 是一种置信度预测器 xff0c 它生成具有用户定义的错误率的预测 在某个置信度水平下 xff0c 所有预测范围的那部分将包括正确的标签
  • 如何在 Ubuntu 和相关发行版中安装 Python 3.11

    如何在 Ubuntu 等 Linux 中安装 Python 3 11 Linux 中国 python linux ubuntu sudo debugpoint 软件包 网易订阅 如何在 Ubuntu 和相关发行版中安装 Python 3 1
  • 挡板测试

    挡板测试其实是MOCK程序的一种 xff0c 用于超大型项目 就是仅提供一个或者几个功能测试的沙盒beta 版本 首先 xff0c 挡板测试在测试领域提到的不是很普遍 挡板测试大概就是 xff1a 在一些跨系统的性能测试项目中 xff0c
  • Error: pg_config executable not found

    解决方案 xff1a 1 安装libpq dev sudo apt get install libpq dev 2 安装python dev sudo apt get install python dev 3 安装psycog2 usr b
  • 深度学习——正则化

    转自https www cnblogs com oto G p 15844581 html 全是自我理解 xff0c 表达不严谨 xff0c 仅供参考 本文默认正则化范数为L1范数 这是今天讨论的问题 xff1a 为什么融入正则的损失函数能
  • 利用深度学习检测恶意代码

    1 引言 当前 xff0c 恶意软件的检测已经成为全社会关注的网络安全焦点 xff0c 因为许多时候 xff0c 单个恶意软件就足以导致数百万美元的损失 目前的反病毒和恶意软件检测产品 xff0c 一般采用的是基于特征的方法 xff0c 它
  • js读取excel中日期格式转换问题

    方法一 在使用js xlsx插件来读取excel时 会将2018 10 16这种数据自动装换成48264 12584511 所以需要自己手动再转换回来 excel读取2018 01 01这种时间格式是会将它装换成数字类似于46254 154
  • ESP32超详细学习记录:wifi配网,AP配网,浏览器配网,无线配网

    不想了解代码实现 xff0c 可直接到代码部分copy xff01 ESP32亲测可用 使用设备ESP32开发板 xff08 ESP32 WROOM 32 xff09 搜了好多别人写的资料 xff0c 很多都是copy 43 copy xf
  • snipaste截图软件安装各种问题解决办法

    http www veryhuo com down html 165392 html
  • ssh: connect to host localhost port 22: Connection refused解决方法

    在通过ssh远程连接树莓派时遇到以下问题 ssh connect to host 192 168 88 88 port 22 Connection refused 1 检查是否安装了openssh server 如果出现了sshd xff0
  • JVM学习随笔02——虚拟机内存区组成与内存溢出异常

    一 Java虚拟机内存区组成图 1 程序计数器 xff1a 每个线程独占一个计数器 xff0c 用来指示该线程下一条要执行的指令的地址 这一部分不会导致内存异常 PS xff1a 如果一个线程进入的是一般的Java方法 xff0c 计数器指