四:虚拟机是如何为对象分配内存空间的?

2023-10-27

“指针碰撞”(Bump the Pointer) && “空闲列表”(Free List)

 

假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。

 

如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。

 

选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。因此,在使用Serial、ParNew等带Compact(整理)过程的收集器时,系统采用的分配算法是指针碰撞,而使用CMS这种基于Mark-Sweep算法的收集器时,通常采用空闲列表

 

如何解决对象空间分配时的并发问题?

引入:

除如何划分可用空间之外,还有另外一个需要考虑的问题是对象创建在虚拟机中是非常频繁的行为,即使是仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的, 可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。解决这个问题有两种方案,一种是对分配内存空间的动作进行同步处理

 

解决方案:

——实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性;另一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内 存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。

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

四:虚拟机是如何为对象分配内存空间的? 的相关文章

  • Cobalt Strike 插件汇总

    https github com 001SPARTaN aggressor scripts https github com 360 A Team CobaltStrike Toolset https github com C0axx Ag
  • 背包问题浅析(most basic version)

    什么是背包问题 给你一个背包 能装的物品重量有限 再给你一些物品和它的价值 问你能装下的最大价值是多少 这就是背包问题 其核心思想是动态规划 怎么做 设置一个dp i j 数组 表示在0 i个物品中能装下的最大价值 j表示背包的重量 核心
  • 微信小程序云开发:npm命令提示: ‘npm‘ 不是内部或外部命令,也不是可运行的程序

    文章目录 一 报错 1 1 安装node 1 2 node环境变量配置 一 报错 今天在学习小程序时 因为云函数中需要用到request promise这个模块 我就去复制安装命令发现报错如下 npm命令提示 npm 不是内部或外部命令 也
  • POJ--2709:Painter (贪心)

    1 题目源地址 http poj org problem id 2709 2 解题思路 每个颜料盒可能有3 12种颜色 其中每种颜色50ml 任意三种颜色 假设每种颜色Xml 可以混合出Xml的灰色 现在给出所需颜色的种数N 给出N个值分别
  • 不同路径(动态规划、dfs /LeetCode)

    题目链接 题目描述 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同的路径 示例 1 输入 m
  • el-dialog 导致无法触发背后图层的鼠标事件的解决方法

    说明 如上图 el dialog 对话框出现时默认情况下是点击不了 点击测试123123 这个按钮的 因为 el dialog 出现时 属于最上层的图层 后面的图层会被它覆盖 导致触发不了后面图层的鼠标事件 上图是解决了这个问题之后可以点击
  • 使用UltralISO制作ubuntu启动盘

    1 从Ubuntu官网Ubuntu系统下载 Ubuntu下载系统的iso文件 用来制作的U盘需要是FAT32格式的 可以通过格式化U盘更改
  • 上传拍照的图片base64存储

    上传base64图片功能 这里只放了上传图片的实现类代码 业务逻辑 新增数据时 应该是先上传图片 然后把生产的uuid返回给前台 前台在新增数据时把图片id集合传给后台 拍照图片上传 param resourceChangePicReq 传
  • 网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02

    1 select实现IO复用的思路02 下面的都是伪代码 主要讲究思路 1 lfd socket 2 bind 3 listen 4 将lfd添加到select的读集合用于传入 借助内核帮我们监听事件 而不直接调用accept函数监听 为了
  • jmeter生成接口测试报告

    一 安装Ant配置 1 下载地址 https ant apache org bindownload cgi 2 安装Ant 下载解压 3 配置环境变量 新建变量ANT HOME 值为D ant apache ant 1 10 12 系统变量
  • 机器学习、深度学习、图像检索 的一些优秀博客

    机器学习 深度学习 图像检索 的一些优秀博客 1 http www cnblogs com ooon 2 http yongyuan name blog
  • 怎么向OpenHarmony的Git仓推送代码

    1 Git设置 git config global user name yourname 随意 git config global user email your email address DCO验证的邮箱 设置记住密码 git conf
  • React Hooks 在使用上有哪些限制?

    React Hooks 的限制主要有两条 不要在循环 条件或嵌套函数中调用 Hook 在 React 的函数组件中调用 Hook 那为什么会有这样的限制呢 就得从 Hooks 的设计说起 Hooks 的设计初衷是为了改进 React 组件的
  • 【docker-compose】从构建镜像到一键运行Java项目

    先来思考个问题 新机器跑一个常规springboot项目要几步 1 下载并配置java环境 mysql环境 redis环境 6步 2 初始化mysql数据库 导入sql文件 2步 3 下载jar包 启动 2步 大概分为零零碎碎的十多步 每块
  • EasyExcel使用教程-实现页面中批量导入导出数据-详解

    EasyExcel介绍 EasyExcel是阿里巴巴开源的一个excel处理框架 以使用简单 节省内存著称 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中 而是从磁盘上一行行读取数据
  • PhpStorm 部署web到apache 教程

    1 Edit Configrations 进去之后点server 因为是本地部署 所以写localhost就可以 其他不用动 之后下面有一个start Url 意思就是你点击运行时浏览器要打开的那个界面 我们写项目名称就可以 2 Tool
  • iframe跨域没有权限_浅谈跨域威胁与安全

    WEB前端中最常见的两种安全风险 XSS与CSRF XSS 即跨站脚本攻击 CSRF即跨站请求伪造 两者属于跨域安全攻击 对于常见的XSS以及CSRF在此不多谈论 仅谈论一些不太常见的跨域技术以及安全威胁 一 域 域 即域名对应的网站 不同
  • 阿里云服务器和轻量云服务器对比有什么区别?

    阿里云轻量应用服务器和云服务器ECS有什么区别 ECS是专业级云服务器 轻量应用服务器是轻量级服务器 轻量服务器使用门槛更低 适合个人开发者或中小企业新手使用 可视化运维 云服务器ECS适合集群类 高可用 高容灾企业级架构 使用相对于轻量更
  • 详细解析STM32的时钟系统

    STM32的时钟系统 一 时钟系统框图 1 1 STM32F10x 1 2 STM32F40x 二 时钟系统 2 1 STM32F10x时钟源 HSI RC振荡器 频率8MHz 精度不高HSE 外接石英 陶瓷晶振 4MHz 16MHz LS

随机推荐

  • java的作用域

    文章目录 作用域 细节 注意 作用域 在java中 主要变量就是成员变量和局部变量 一般局部变量指的是成员方法中定义的变量 作用域的分为全局变量和局部变量 全局变量的作用域在整个类体 除了属性之外的都是局部变量 作用域只能用于某块 全局变量
  • 软件测试质量度量指标

    软件测试质量度量指标 度量模块 度量指标 统计方法 度量说明 产品完成度 1 需求通过率 已通过需求 已计划需求 体现需求的完成度 也常可以统计为 测试用例通过数 计划的测试用例总数 即默认用例覆盖是完全的 2 功能点通过率 已通过功能点
  • 安装驱动时出现“INF中的服务安装段落无效”

    今天安装ti开发板的驱动 在安装虚拟串口时出现 INF中的服务安装段落无效 以致驱动未安装成功 接下来我就说说我的解决过程 因为提示的是 inf中的 了解驱动的就知道有个扩展名为inf的文件 于是准备 打开驱动目录中的inf文件 如下图 有
  • 【延期至12月】2022年网络安全国际研讨会(CSW2022)

    延期至12月 2022年网络安全国际研讨会 CSW2022 重要信息 会议网址 www cybersecurityworkshop org 会议时间 2022年12月16 18日 召开地点 杭州 截稿时间 2022年10月20日 录用通知
  • 商业不是战争

    我在一个大客户那里工作的时候经常想这样一件事 他们 以及国内很多 IT或者非IT 企业 讲军事化管理 讲服从命令 为什么我总觉得这事不对 到底不对在什么地方 我想出来的结论是 商业不是战争 第一 商业的特点是negotiatable 战争是
  • 单链表中间值(经典案例,5分钟解决)

    一 题目描述 给定一个单链表 但不知该表的大小 现要求只遍历一次 找出位于单链表中间的值 输入 1 8 7 6 4 5 3 1 输出 6 样例输入 Copy 1 2 4 8 9 6 3 1 0 样例输出 Copy 9 二 实现方法 普通方法
  • 创新零售,京东重新答题?

    继新一轮组织架构调整后 京东从低价到下沉动作不断 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合 近日 京喜拼拼已改名为京东拼拼 与七鲜 前置仓等业务共同承载起京东线上线下加速融合的梦想 同时 拼拼的更名 也被外界解读为京东重新点
  • 关于jdbc常见错误

    版本问题 如果运行时控制台报错 Exception in thread main com mysql jdbc exceptions jdbc4 MySQLNonTransientConnectionException Could not
  • k8s-pod的亲和度调度

    文章目录 1 Node Affinity 1 1 node节点的预制标签 1 2 自定义标签 1 2 1 给node增加标签 1 2 2 修改label 1 2 3 修改label 1 3 Require 1 4 Perferred 1 3
  • 商品消费计费课程设计

    具体代码如下 商品销售计费显示系统 输入品种 数量 单价 计算并显示顾客应付的款数 并打印清单 include
  • metasploitable2

    nmap使用 nmap sP IP段 掩码 范围内ping通的所有主机 通过抓包只看到发了arp包 还没有找全局域网内所有主机 nmap sP 192 168 43 0 24 PS 让nmap使用SYN包而不是ACK包来对目标主机进行扫描
  • pyinstaller 打包程序 出现错误的解决方法

    打开命令窗口进入到程序所在目录下 1 使用命令pyinstaller p C Python27 Lib site packages zmq SpiderTaskDistributor py 打包程序 p参数是添加的pyinstaller打包
  • Quartz简单应用(Springboot环境)

    需求 在项目中免不了会使用定时任务来执行一些自动化的操作 简单的定时任务可以在方法上加上 Schedule的注解来执行定时任务 但是如果有多个同级的模块在不同的时间点执行同一个方法 就没办法仅仅使用 Schedule来执行了 侃场景 现在某
  • Linux Tomcat JVM 参数调优

    Linux Tomcat JVM 参数调优 适用场景 Tomcat 长期运行过程遇到Caused by java lang OutOfMemoryError PermGen space或java lang OutOfMemoryError
  • VB.net对于datagride控件的使用及C#中datagrideView\bindingSource\bindingNavigator\tabcontrol控件的应用

    绑定数据源 DataSet ds new DataSet SqlConnection connection new SqlConnection netiFace ConnectionString ConnectionString conne
  • d指针在Qt上的应用及实现

    Qt为了使其动态库最大程度上实现二进制兼容 引入了d指针的概念 那么为什么d指针能实现二进制兼容呢 为了回答这个问题 首先弄清楚什么是二进制兼容 所谓二进制兼容动态库 指的是一个在老版本库下运行的程序 在不经过编译的情况下 仍然能够在新的版
  • pip使用踩坑集合

    1 python版本切换后 pip不好用了 报错如下 使用 python m pip install U pip 命令对pip进行更新 2 pip安装包时 报错如下 网络状态有问题 国外源挂梯子 国内源关梯子 3 windows系统下pyt
  • GD32 笔记 05:如何使用 DMA 配合 ADC,以软触发的方式采集电压

    文章目录 一 前言 二 主要代码 1 变量定义 2 初始化配置函数 GPIO ADC DMA 3 主函数 一 前言 测试时使用的 MCU 是 GD32E230 测试例程下载地址是 20210409 test gd32 usart dma z
  • Linux下安装NetworkManger

    NetworkManager简介 NetworkManager由一个管理系统网络连接 并且将其状态通过D BUS 是一个提供简单的应用程序互相通讯的途径的自由软件项目 它是做为freedesktoporg项目的一部分来开发的 进行报告的后台
  • 四:虚拟机是如何为对象分配内存空间的?

    指针碰撞 Bump the Pointer 空闲列表 Free List 假设Java堆中内存是绝对规整的 所有用过的内存都放在一边 空闲的内存放在另一边 中间放着一个指针作为分界点的指示器 那所分配内存就仅仅是把那个指针向空闲空间那边挪动