JVM(一):JVM内存模型(面试常见考点)

2023-10-29

JVM内存模型

 

如下图所示:

FloatCloud

 

 

线程私有:

 

程序计数器:

字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。

1:用于顺序调用程序指令,完成程序的流程控制(如:顺序执行、选择、循环、异常处理。)

2:多线程状态下,用于记录当前线程运行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

虚拟机栈:

java 内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)

Java 虚拟机栈会出现两种异常:StackOverFlowError 和 OutOfMemoryError。

  • StackOverFlowError: 若Java虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就抛出StackOverFlowError异常。
  • OutOfMemoryError: 若 Java 虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完了,无法再动态扩展了,此时抛出OutOfMemoryError异常。

本地方法栈: 

虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

  • 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。
  • 方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种异常。

 

线程共享:

 

堆:

java管理内存中最大的一块,Java 堆是所有线程共享的一块内存区域,用于存储对象的实例;

Java 堆是垃圾收集器管理的主要区域,因此也被称作GC堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:再细致一点有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

 

在JDK1.8中,移除整个永久代,取而代之的元空间(Metaspace):永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制。

 

方法区:

各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。主要目的是为了与堆(Heap)区分开来,方便GC(垃圾收集器)。

 

运行时常量池:

是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池信息(用于存放编译期生成的各种字面量和符号引用)

JDK1.7版本及其以后, JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。

 

字面量:

字符串(final类);final修饰常量值;基本数据类型;其他

符号引用:

类和结构的完全限定名(访问限定修饰符);字段名称和描述符;方法名称与描述符。

 

 

额外内容

直接内存:

并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域。

JDK1.4中新加入的 NIO(New Input/Output) 类,引入了一种基于通道(Channel) 与缓存区(Buffer) 的 I/O 方式,它可以直接使用Native函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆之间来回复制数据。

 

惯例,二次元老婆来了!

 

 

 

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

JVM(一):JVM内存模型(面试常见考点) 的相关文章

随机推荐

  • 2022年iOS上架及证书最新申请流程

    最近的15年 手机行业无论怎么变 ios系统依然还是占据着行业的榜首位置 而打包一个苹果的app 门槛则比较高 主要的原因在于苹果app的开发 打包时需要p12格式的证书文件和描述文件profile文件 在hbuilder和apicloud
  • 关于串口助手接收到数据,但显示的数据(16进制)为00的解决方法

    只需要把波特率调低就行
  • 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的 所以作者若是看到不允许转载 请给我留言或给我邮件 lushiliangcsdn 163 com 我会立即删除 转载原因 这篇文章把pid 算法解释的很详细 我担心以后这篇文章无故删除 才转载到我这边的 谢谢 转载来源于
  • 错误代码57049处理

    DB2 SQLSTATE 57049 处理过程 错误代码57049 修改 etc services 修改实例参数db2inst1参数 错误代码57049 db2 connect to 数据库 后报 SQLSTATE 57049 错误 SQL
  • Ubuntu18.04 搭建ros环境

    目录 一 查询版本 二 配置Ubuntu软件库 三 安装 1 设置安装源和密钥 2 更新可用软件包列表 问题 问题 3 安装 4 初始化 问题 5 更新 6 添加环境变量 7 安装rosinstall 8 安装catkin编译器 9 实例测
  • U3D客户端框架之小堆顶高性能定时器测试10W计时器耗时1.9ms

    1 小顶堆计时器概要 小根堆定时器的优点如下 a 添加时间复杂度为O 1 b 删除时间复杂度为O 1 c 执行一个定时器的时间复杂度为O 1 2 代码设计 之前写的服务器定时器是全部轮询更新 这种计时器性能太差 每一帧都要全部迭代一次 客户
  • 全网最全的最通俗易懂的-jmeter调试错误全集

    一 前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题 但是无从下手 不知道从哪里开始找起 对于初学者而言这是一个非常头痛的事情 这里结合笔者的经验 总结出以下方法 二 通过查看运行日志调试问题 写好脚本后 可以先试着运
  • 强化学习入门笔记

    学习情况 先后听了两门课程 分别是David Silver的RL和Sergey Levin的DRL 各耗时一周左右 后者更难一些 对RL基本概念 常用算法原理及其伪代码有了大致了解 但是因为时间有点赶 没有敲完整的算法代码 由于已经有写得比
  • vue每个生命周期的作用,以及在哪个阶段发请求,详解

    1 什么是vue生命周期 有什么作用 每个 Vue 实例在被创建时都要经过一系列的初始化过程 例如 需要设置数据监听 编译模板 将实例挂载到 DOM 并在数据变化时更新 DOM 等 同时在这个过程中也会运行一些叫做 生命周期钩子 的函数 这
  • C++文件 I/O操作

    文件流类和文件流对象 输入输出是以系统指定的标准设备 标准设备 输入设备为键盘 输出设备为显示器 为对象 在实际的开发中 不可避免会以磁盘文件作为对象 即从磁盘文件读取数据 将数据输出到磁盘文件 与文件输入输出有关的类主要定义在fstrea
  • verilog 不可综合语句

    础知识 verilog 不可综合语句 1 所有综合工具都支持的结构 always assign begin end case wire tri aupply0 supply1 reg integer default for function
  • 前端批量删除之bootstrapTable多选

    获取表单 选中表单的值 var rows exampleTable bootstrapTable getSelections 返回所有选择的行 当没有选择的记录时 返回一个空数组 if rows length 0 layer msg 请选择
  • Node16版本 对应node-sass和sass-loader的版本号

    node sass 6 0 1 sass loader 10 2 0 1 打开package json文件 把图中node sass和sass loader的版本号进行修改 版本号改成上面代码所示的版本 2 改完记得要打开终端重新npm i
  • 决策树(decision tree)(一)——构造决策树方法

    决策树 decision tree 一 构造决策树方法 说明 这篇博客是看周志华老师的 机器学习 西瓜书 的笔记总结 虽然自己写了很多总结性文字包括一些算法细节 但博客中仍有部分文字摘自周老师的 机器学习 书 仅供学习交流使用 转载博客务必
  • 对象及原型链

    对象及原型链 面向对象的三大特性 原型链 创建对象的方法 原型 构造函数 实例 原型链 原型 构造函数 实例三者之间的关系 原型链 基本原理 原型链的关键 instanceof的原理 new运算符 类继承和原型继承的区别 本文仅为前端初学者
  • 异常点检测算法分析与选择

    1 1 常见异常点检测算法 在数据库中包含着少数的数据对象 它们与数据的一般行为或特征不一致 这些数据对象叫做异常点 Outlier 也叫做孤立点 异常点的检测和分析是一种十分重要的数据挖掘类型 被称之为异常点挖掘 28 对于异常数据的挖掘
  • 图的三种存储结构:邻接矩阵表示法+链表法+十字链表法

    一 邻接矩阵表示法 1 简介 图的邻接矩阵表示法也称作数组表示法 它采用两个数组来表示图 一个是用于存储顶点信息的一维数组 另一个是用于存储图中顶点之间关联关系的二维数组 称为邻接矩阵 2 示例 1 无向图邻接矩阵 2 有向图邻接矩阵 3
  • Vue 利用文本域做一个批量添加选项功能

    需要用到的 知识点 1 Element UI 的 Dialog 对话框
  • Allegro PCB设置高亮某个网络,提高对比度

    对于硬件工程师来说 检查PCB layout走线是经常的时候 但是网上我查找很多的教程 很少有说清楚怎么高亮某个网络 并且特别高亮 提高对比度的操作 1 点击Assign Color 扫把 弹出Options窗口 选择要高亮网络的颜色 比如
  • JVM(一):JVM内存模型(面试常见考点)

    JVM内存模型 如下图所示 线程私有 程序计数器 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令 分支 循环 跳转 异常处理 线程恢复等功能都需要依赖这个计数器来完 1 用于顺序调用程序指令 完成程序的流程控制 如