openjdk17 从C++源码视角看 ArrayList对象在内存中占用24个字节

news2024/12/23 6:50:10

ArrayList对象在内存中占用24个字节,并且在栈上分配。

##java内存分布jol查看工具的查询结果

java.util.ArrayList object internals:
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     0x0000000000000005 (biasable; age: 0)
  8   4                      (object header: class)    0x00032490
 12   4                  int AbstractList.modCount     0
 16   4                  int ArrayList.size            0
 20   4   java.lang.Object[] ArrayList.elementData 

##实验代码

import java.util.ArrayList;
import java.util.List;

public class OutOfMemoryTest {

    public static void main(String[] args) {
        List<MiBigObject> miBigObjects = new ArrayList<>(260000);
        System.out.println(miBigObjects);
    }

}

ThreadLocalAllocBuffer::allocate 方法确实负责从线程本地分配缓冲区(TLAB)中分配内存。这个方法尝试在当前线程的 TLAB 中分配指定大小的内存块。

分析代码

  1. 获取当前顶部指针

    • HeapWord* obj = top(); 获取当前 TLAB 的顶部指针。
  2. 检查空间是否足够

    • if (pointer_delta(end(), obj) >= size) 检查从当前顶部指针到 TLAB 结束的剩余空间是否足够容纳请求的大小。
  3. 分配内存

    • 如果空间足够,方法将顶部指针 top 向前移动 size 个 HeapWord,并返回原来的顶部指针 obj 作为分配的内存块的起始地址。
  4. 断言检查

    • 在 ASSERT 宏定义的情况下,代码会将分配的内存块(除了对象头部)填充为一个特殊的值 badHeapWordVal,以确保并发 GC 线程不会错误地解析这块内存。
  5. 更新顶部指针

    • set_top(obj + size); 更新 TLAB 的顶部指针。
  6. 返回分配的内存

    • 如果分配成功,返回 obj;如果失败,返回 NULL

计算分配的字节数

  • size 参数表示要分配的 HeapWord 数量。
  • 每个 HeapWord 的大小通常为 8 字节(在 64 位系统中)。

因此,如果 size = 3,则分配的内存大小为: 3 HeapWords×8 bytes/HeapWord=24 bytes3 HeapWords×8 bytes/HeapWord=24 bytes

总结

代码展示了如何从线程本地分配缓冲区中分配内存。在这个例子中,请求分配的大小为 3 个 HeapWord,即 24 字节。这种分配方式是为了减少分配时的锁争用,提高内存分配效率。

这段代码是在 TLAB 上分配了 24 字节的内存。这种分配是在 Java 堆上进行的,而不是在栈上。TLAB 是 Java 堆的一部分,用于提高对象分配的效率。

##C++源码 

HeapWord* MemAllocator::mem_allocate(Allocation& allocation) const {
  if (UseTLAB) {
    HeapWord* result = allocate_inside_tlab(allocation);
    if (result != NULL) {
      return result;
    }
  }

  return allocate_outside_tlab(allocation);
}
HeapWord* MemAllocator::allocate_inside_tlab(Allocation& allocation) const {
  assert(UseTLAB, "should use UseTLAB");

  // Try allocating from an existing TLAB.
  HeapWord* mem = _thread->tlab().allocate(_word_size);
  if (mem != NULL) {
    return mem;
  }

  // Try refilling the TLAB and allocating the object in it.
  return allocate_inside_tlab_slow(allocation);
}
inline HeapWord* ThreadLocalAllocBuffer::allocate(size_t size) {
  invariants();
  HeapWord* obj = top();
  if (pointer_delta(end(), obj) >= size) {
    // successful thread-local allocation
#ifdef ASSERT
    // Skip mangling the space corresponding to the object header to
    // ensure that the returned space is not considered parsable by
    // any concurrent GC thread.
    size_t hdr_size = oopDesc::header_size();
    Copy::fill_to_words(obj + hdr_size, size - hdr_size, badHeapWordVal);
#endif // ASSERT
    // This addition is safe because we know that top is
    // at least size below end, so the add can't wrap.
    set_top(obj + size);

    invariants();
    return obj;
  }
  return NULL;
}

##gdb调试堆栈 3个 word  。一个word=8个字节。3*8=24字节。

#0  ThreadLocalAllocBuffer::allocate (this=0x7ffff0028a30, size=3) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/gc/shared/threadLocalAllocBuffer.inline.hpp:40
#1  0x00007ffff677a0a4 in MemAllocator::allocate_inside_tlab (this=0x7ffff7bfce30, allocation=...)
    at /home/yym/openjdk17/jdk17-master/src/hotspot/share/gc/shared/memAllocator.cpp:274
#2  0x00007ffff677a3bf in MemAllocator::mem_allocate (this=0x7ffff7bfce30, allocation=...) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/gc/shared/memAllocator.cpp:352
#3  0x00007ffff677a428 in MemAllocator::allocate (this=0x7ffff7bfce30) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/gc/shared/memAllocator.cpp:365
#4  0x00007ffff6351347 in CollectedHeap::obj_allocate (this=0x7ffff00453d0, klass=0x100054468, size=3, __the_thread__=0x7ffff0028920)
    at /home/yym/openjdk17/jdk17-master/src/hotspot/share/gc/shared/collectedHeap.inline.hpp:36
#5  0x00007ffff6344ef4 in InstanceKlass::allocate_instance (this=0x100054468, __the_thread__=0x7ffff0028920)
    at /home/yym/openjdk17/jdk17-master/src/hotspot/share/oops/instanceKlass.cpp:1385
#6  0x00007ffff63687d9 in InterpreterRuntime::_new (current=0x7ffff0028920, pool=0x7fffd9b70330, index=35)
    at /home/yym/openjdk17/jdk17-master/src/hotspot/share/interpreter/interpreterRuntime.cpp:243
#7  0x00007fffe1023ad2 in ?? ()
#8  0x00007fffe1023a46 in ?? ()
#9  0x00000000fff37f50 in ?? ()
#10 0x00007ffff7bfcfb0 in ?? ()
#11 0x00007fffd9b73d4d in ?? ()
#12 0x00007ffff7bfd038 in ?? ()
#13 0x00007fffd9b7af60 in ?? ()
#14 0x0000000000000000 in ?? ()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 教程之三十六:实现身份验证

如何在 Spring Boot 中实现简单的身份验证&#xff1f; 在本文中&#xff0c;我们将学习如何使用 Spring设置和配置基本身份验证。身份验证是任何类型的安全性中的主要步骤之一。Spring 提供依赖项&#xff0c;即Spring Security&#xff0c;可帮助在 API 上建立身份验证。有很…

什么样的LabVIEW控制算自动控制?

自动控制是指系统通过预先设计的算法和逻辑&#xff0c;在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整&#xff0c;达到预期目标的过程。LabVIEW作为一种图形化编程工具&#xff0c;非常适合开发自动控制系统。那么&#xff0c;什么样的LabVIEW控制算作“自动…

GFPS扩展技术原理(七)-音频切换消息流

音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力&#xff0c;触发连接做切换&#xff0c;获取或设置音频切换偏好&#xff0c;通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07&#xff0c;Message codes如下&#xff1a; MAC of Audio s…

视频直播点播平台EasyDSS与无人机技术的森林防火融合应用

随着科技的飞速发展&#xff0c;无人机技术以其独特的优势在各个领域得到了广泛应用&#xff0c;特别是在森林防火这一关键领域&#xff0c;EasyDSS视频平台与无人机技术的融合应用更是为传统森林防火手段带来很大的变化。 一、无人机技术在森林防火中的优势 ‌1、快速响应与高…

机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及RRT四种算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1贪婪搜索算法原理 4.2最安全距离算法原理 4.3RPM 算法原理 4.4 RRT 算法原理 5.完整程序 1.程序功能描述 机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及R…

【论文笔记】Visual Alignment Pre-training for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功&#xff0c;接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

C++-----函数与库

数学中的函数与编程中的函数对比 数学中的函数 - 数学函数是一种映射关系&#xff0c;例如&#xff0c;函数\(y f(x)x^{2}\)&#xff0c;对于每一个输入值\(x\)&#xff0c;都有唯一确定的输出值\(y\)。它侧重于描述变量之间的数量关系&#xff0c;通常通过公式来表示这种关系…

带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式适配器模式&#xff08;Adapter Pattern&#xff09;概述talk is cheap&#xff0c; show you my code总结 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是面向对象软件设计中的一种结构型设计…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

初等函数整理

1.幂函数 2.指数函数 3.对数函数

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将写到一些手搓常用工具&#xff0c;方便在项目中的使用&#xff0c;并且在手搓的过程中一些函数如&#xff1a;日志 宏中的__VA_ARGS__接收可变参…

路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)

狼群算法(Wolf Pack Algorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为方式来实…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】

继上一篇的hello world&#xff1a; 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】-CSDN博客】 这一篇我们开始任务的创建。 工程还是用上一篇的hello world作为模板&#xff0c;hello world就不再app_main函数中输出&#xff0c;改成在任务…

用音乐与自我对话 ——澄迈漓岛音乐节x草台回声

四季循环&#xff0c;昼夜往复&#xff0c;在相对恒定的日常中&#xff0c;音乐是扇打量世界又内观本心的双向窗户。难以描述的触动&#xff0c;透过音乐语言转换为温热且真实的吟唱&#xff0c;一次又一次记录与释放。 除却生浪主舞台中的声音玩具乐队以及STOLEN秘密行动&…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负&#xff0c;然后下正上负。当二极管接到反向电压&#xff0c;二极管存在寄生电容&#xff0c;电压不能立刻突变&#xff0c;当输入频率变高时&#…

HTTP协议及安全防范

由于图片解析问题&#xff0c;可以点击查看 &#x1f449;&#x1f3fb; 博客原文 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议&#xff0c;客户端通过发送请求到服务器来获取…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件&#xff0c;实现了高精度的温度、盐度和深度测量&#xff0c;并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具&#xff0c;用LabVIEW开发了一套测控系统&am…

基于自然语言处理自动分配和高效执行制造任务可提高制造代理的灵活性和适应性

概述 论文地址&#xff1a;https://arxiv.org/abs/2406.01893 本研究提出了一种将大规模语言模型&#xff08;LLMs&#xff09;集成到多代理系统&#xff08;MAS&#xff09;中的新框架&#xff0c;以解决传统制造业在适应动态环境和快速响应生产变化方面所面临的困难。具体来…