虚拟机中对象的内存分配的两种方式

2023-11-17

创建对象必然要在虚拟机中分配内存,虚拟机提供了两种策略:指针碰撞和空闲列表

指针碰撞法

很容易理解,在内存中,一遍是已经被分配的空间,一遍的未分配的空间,如果新建了8字节对象,那么指针就往未分配空间移动8字节,所以使用这种方式的关键是保证分配的对象地址连续,取决与垃圾清楚算法;

空闲列表法

既然上面的方法要地址连续,那么地址不连续怎么办呢?

这种情况下使用空闲列表法,记录所有地址,新建对象就从没有使用的地址段中选,并且也是随机的,不知道选用的是哪个段;

 

那么还有一个很严重的问题,创建对象很可能是在多线程环境下操作,那么要怎么保证线程安全呢?

其实学习过多线程,保证线程安全可以分为3种思想:悲观锁、乐观锁、隔离;

悲观锁

比如synchronized,ReentrantLock等,但是在虚拟机中没有使用这种方式

乐观锁

cas :比较交换算法,旧的内存值,副本值,新值,如果旧的内存值和副本值相同,那么我们就认为这次更新是有效的,那么更新就成功了,否则失败重试!

 

隔离

tlab区域,我们知道,这是一个空间比较小的区域,并且不是共享的,那么每个线程在操作私有的属性的时候,那么当然就不存在线程安全问题了,   还有一个就是方法中的局部变量,也是安全的,    我认为这两种都是隔离

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

虚拟机中对象的内存分配的两种方式 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 基于nginx的tomcat负载均衡和集群(超简单)

    今天看到 基于apache的tomcat负载均衡和集群配置 这篇文章成为javaEye热点 略看了一下 感觉太复杂 要配置的东西太多 因此在这里写出一种更简洁的方法 要集群tomcat主要是解决SESSION共享的问题 因此我利用memca
  • OpenCV的使用——读取、写入和显示图像

    代码 import the cv2 library import cv2 The function cv2 imread is used to read an image Read an image img color cv2 imread
  • Java JDBC连接数据库 查询SELECT

    package com edu import java sql public class jdbctest public static void main String args throws SQLException ClassNotFo
  • ubuntu 查看显卡命令

    要查看 Ubuntu 系统中的显卡信息 可以使用如下命令 lspci grep VGA 这条命令可以列出系统中所有的显卡设备 lshw c video 这条命令可以列出系统中的所有显卡信息 包括型号 芯片厂商和其他详细信息 glxinfo
  • Android颜色透明度(不透明度)对应的十六进制

    颜色值 AARRGGBB 透明度百分比和十六进制对应关系 下面是透明度 再加上平常写得颜色值就表示该颜色值多少透明度了 一 一张表格 基本都概括 方便查找和使用 透明度 十六进制 100 FF 99 FC 98 FA 97 F7 96 F5
  • 计算机操作系统实验三 进程间的通信

    一 实验目的 1 了解什么是管道 2 熟悉UNIX LINUX支持的管道通信方式 3 了解什么是消息 4 熟悉消息传送的机理 二 实验内容 1 编写程序实现进程的管道通信 用系统调用pipe 建立一管道 二个子进程P1和P2分别向管道各写一
  • 数字图像处理 在小波域中分析信号和图像

    一 简述 小波变换是用于分析特征在不同尺度上变化的数据的数学工具 对于信号 特征可以是随时间变化的频率 瞬态或缓慢变化的趋势 对于图像 特征包括边缘和纹理 小波变换主要是为了解决傅立叶变换的局限性而创建的 傅立叶分析是将信号分解为特定频率的
  • sql如何取出前面3行的数据

    sql中如何取出前面3行的数据 用limit 3限制就好 SELECT from tmp test1 order by share desc LIMIT 3 得到结果集
  • Java基础——Java中的枚举类(深入理解,配合代码学习更轻松)

    Java中的枚举类 枚举类的使用 类的对象只有有限个 确定的 比如 星期 一 二三 四 五 六 日 当需要定义一组常量时 强烈建议使用枚举类 配合代码来理解一下 自定义枚举类 JDK5 0之前的版本采用的方式 package com hau
  • 再读红宝书(第四版) 第五章 基本引用类型

    引用值 或者对象 是某个特定引用类型的实例 在 ECMAScript 中 引用类型是把数据和功能组织到一起的结构 经常被人错误地称作 类 虽然从技术上讲 JavaScript 是一门面向对象语言 但ECMAScript 缺少传统的面向对象编
  • 点亮LED实现按住不亮,松手点亮

    include
  • pandas导出到Excel报URLS数量超出65530警告

    今天在整理数据时报警告 gt gt gt df all to excel xxxx xlsx index False home microfat local lib python3 6 site packages xlsxwriter wo
  • 最新数据库流行度最新排名(每月更新)

    2023年09月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多 这个数据库就被认为越受欢迎 这是一个领先指标 原始数据来自谷歌Trends 如果您相信集体智慧 那么
  • LVMforLinux测试报告(转)

    LVMforLinux测试报告 转 more 一 测试系统环境 系统平台 Red Hat Linux Advanced Server 2 1 内核版本 2 4 18 服务器 DELL 6300 LVM内核支持版本 1 0 1 LVM工具版本
  • Pandas知识点-合并操作merge

    Pandas知识点 合并操作merge merge 方法是Pandas中的合并操作 在数据处理过程中很常用 本文介绍merge 方法的具体用法 一 基础合并操作 merge left right 将两个DataFrame或Series合并到
  • buck变换器设计matlab_【原创】24V开关电源分析与设计、纹波抑制之等效串联电阻与并联电容(上)...

    文章来自电子星球APP 24V开关电源分析与设计 纹波抑制之等效串联电阻与并联电容 作者 张东辉 此篇文章的核心是探讨降压开关电源分析与纹波抑制的相关问题 如有疑问 欢迎到评论区里留言 谢谢 我已将本文涉及资料Buck 24V for Ps
  • java中switch语句用法详解

    1 switch语句的基本语法 int week switch week week为定义的变量 case case 之后使用空格再加 满足week的值 执行语句 当满足此case 中的条件时 所要执行的语句 case 执行语句 defaul
  • Vue2 使用el-table-infinite-scroll

    为什么要使用el table infinite scroll 列表数据太多 后端又不好分页 一次性加载大量的数据渲染视图会导致页面卡顿 这时候就需要用到el table infinite scroll来 分批 渲染 如 进入页面先渲染视图可
  • ETest快速测试:零代码!无门槛!上手快!

    时长10 01 视频演示 ETest快速测试 在完整的软件项目开发周期中 软件测试工作占了一半以上的时间 随着软件功能越来越复杂 代码量成倍增加 软件开发 升级 迭代的周期越来越短 传统高成本的测试方式已无法满足软件开发的需求 快速测试可以
  • 虚拟机中对象的内存分配的两种方式

    创建对象必然要在虚拟机中分配内存 虚拟机提供了两种策略 指针碰撞和空闲列表 指针碰撞法 很容易理解 在内存中 一遍是已经被分配的空间 一遍的未分配的空间 如果新建了8字节对象 那么指针就往未分配空间移动8字节 所以使用这种方式的关键是保证分