计算Java对象大小(附实际例子分析)

news2025/1/6 20:11:27

对象大小如何计算

对象大小包括俩部分的内容,对象头和对象内容。(图片源于网络)
在这里插入图片描述

对象头

此处假设是64位的JVM

  • 对象地址,占4个字节。
  • 对象标记,占8个字节,包括锁标记,hashcode, age 等。
  • 数组长度标记,占4哥字节。如果对象是一个数组,会有此标记,否则没有。

对象内容

  • 对象内部属性。如果属性是对象的话,那么记录的是对象的地址,占用4个字节。

8字节对齐

  • Java对象采用的是8字节对齐。对象大小必须是8的倍数,不足需要补齐。比如,计算一个对象只需要20字节,那么实际占用24字节。

计算对象大小

  • 引入 如下的 pom文件
 <dependency>
         <groupId>org.apache.lucene</groupId>
         <artifactId>lucene-core</artifactId>
         <version>8.7.0</version>
 </dependency>
  • 测试
 Integer i = new Integer(11);
 System.out.println(RamUsageEstimator.shallowSizeOf(i));
 
 output:
 16
 Map<String, String> map = new HashMap<>();
 System.out.println(RamUsageEstimator.shallowSizeOf(map));
 
 output:
 48

分析

Integer 对象大小分析

  • 它是对象,占用4个字节
  • 对象标记,占用8个字节
  • 查看源码,发现Integr 内容只有以下一个非static的属性,是一个int的基本类型属性,占用4个字节.static 修饰的方法属性都是存储在方法区的,不占用对象空间。
    /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;
  • 故 total = 4 + 8 + 4 = 16

HashMap 对象大小分析

  • 它是对象,占用4个字节
  • 对象标记,占用8个字节
  • 查看源码,HashMap 是继承了 AbstractMap 的,AbstractMap 中有以下的俩个属性,一共占用8个字节。因为只是存储了keySet, values 的地址
transient Set<K>        keySet;
transient Collection<V> values;
  • HashMap 中有以下属性,共占用 6 * 4 = 24 个字节。
transient Node<K,V>[] table;
transient Set<Map.Entry<K,V>> entrySet;
transient int size;
transient int modCount;
int threshold;
final float loadFactor;
  • total = 4 + 8 + 8 + 24 = 44, 由于java 是8字节对齐的,故一共是 48 字节。

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

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

相关文章

python 如何使用 pandas 在 flask web 网页中分页显示 csv 文件数据

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 python 分页 pandas 数据处理 flask web 框架 jinja 模版 三、菜鸟实战 初始化 Flask 框架&#xff0c;设置路由 jinja 模版 渲染列表数据 分页请求数据 显示详情页数据示例 运行结果 运行截图 …

[oeasy]python0040_换行与回车的不同_通用换行符_universal_newlines

换行回车 回忆上次内容 区分概念 terminal终端 主机网络中 最终的 端点 TeleTYpewriter 电传打印机终端硬件 shell 终端硬件基础上的 软件壳子 Console 控制台 主机旁边 的 控制面板 存储文件 的 时候 我 在文件里 打了回车\n系统 将0x0a存入字节 进文件换行 自动就有 回车…

航空客运订票系统(C语言,软件用的DEV)

这两天整理之前的作业代码&#xff0c;把自己一点一点敲出来的系统又看了一下&#xff0c;挑几个发出来供大家参考。想要源码、报告可以找我啦&#xff0c;代码的注释之前写的都是非常详细的&#xff01; 但是不是无偿的啦&#xff08;不坑&#xff0c;一杯奶茶喽&#xff0c;不…

Java逃逸分析(附实际例子分析)

Java逃逸分析 1. 什么是Java逃逸分析 我们知道对象一般是在堆上生成的&#xff0c;但这并不是绝对的。特例就是今天要说的逃逸分析。 JVM 在分析代码以后&#xff0c;发现一个对象在声明之后&#xff0c;只有在它当前声明的这个函数中调用&#xff0c;那么它就会将这个对象在…

《微SaaS创富周刊》第3期:GPT-3\ChatGPT、Stable Diffusion等AI模型驱动的微SaaS创意盘点

大家新年好&#xff01;第3期《微SaaS创富周刊》问世啦&#xff01;本周刊面向独立开发者、早期创业团队&#xff0c;报道他们主要的产品形态——微SaaS如何变现的最新资讯和经验分享等。所谓微SaaS&#xff0c;就是“针对利基市场的SaaS”&#xff0c;特点是一般由个人或者小团…

网络爬虫的危害与防御方法

爬虫程序是一种计算机程序&#xff0c;旨在通过执行自动化或重复性任务来模仿或替代人类的操作。爬虫程序执行任务的速度和准确性比真实用户高得多。爬虫程序在互联网上扮演着各种各样的角色&#xff0c;超过一半的网络流量是由爬虫程序产生的。有些爬虫程序非常有用&#xff0…

v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例

文章目录1、v-show与v-if的共同点2、v-show与v-if的区别3、v-show与v-if的使用场景4、附属到组件和普通元素时的情况4.1、v-show4.2、v-if5、具体实现的效果5.1 查看是否渲染5.2 查看调用的钩子函数6、钩子函数实现的过程分析1、v-show与v-if的共同点 v-show和v-if的作用效果是…

共享模型之管程(五)

1.多线程设计模式 1.1.同步模式之保护性暂停 1.1.1.定义 1>.即Guarded Suspension,用在一个线程等待另一个线程的执行结果的场景中; 2>.使用场景 ①.有一个结果(数据)需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject; ②.如果有结果(数据)不断从一个…

Vitepress(一):基础教程

什么是Vitepress Vitepress是使用Vue3Vite来快速搭建一个个人网站的工具&#xff0c;网站搭建者不需要掌握Vue3&#xff0c;Vite等的具体内容&#xff0c;只需要简单的配置就可以生成Vue风格的个人网站 官方地址&#xff1a;https://vitejs.cn/vitepress/ 本教程希望教会大家…

SD Nand 与 SD卡 SDIO模式应用流程

SD Nand/SD卡 SDIO模式应用流程 文章目录SD Nand/SD卡 SDIO模式应用流程1. 前言1.1 参考文档1.2 概述2. Response响应类型及格式3. 各步骤流程3.1 卡识别流程3.2 通讯速率及总线宽度修改流程3.3 擦除流程3.4 单块读流程3.5 单块写流程3.6 多块读流程3.7 多块写流程4. 结束语SD …

Java初识泛型 | 如何通过泛型类/泛型方法实现求数组元素最大值?

目录 一、引言 二、编程分析 1、泛型类实现 思路 代码 2、泛型方法实现 思路 代码 三、拓展&#xff1a;数组排序&#xff08;以冒泡排序为例&#xff09; 1、int类型 原代码 2、泛型类 3、泛型方法 一、引言 给定一个整型数组&#xff0c;求数组中所有元素的最大…

JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)

文章目录前言一、class文件初始化过程1、概述2、初始化过程-案例1a、代码T001_ClassLoadingProcedure 类加载过程b、解析3、初始化过程-案例2a、代码b、解析二、单例模式-双重检查三、硬件层数据一致性1、硬件层的并发优化基础知识b、Intel 的缓存一致性协议&#xff1a;MESI四…

Vivado综合设置之-keep_equivalent_registers

-keep_equivalent_registers即保留等效寄存器&#xff0c;所谓等效寄存器是指共享输入端口&#xff08;输入时钟端口clk和输入数据端口rst&#xff09;的寄存器。 勾选它时&#xff0c;意味着Vivado不会对等效寄存器进行优化&#xff1b; 不勾选它时&#xff08;默认情况&…

eclipse安装UML插件

安装AmaterasUML AmaterasUML 是一个用于 Eclipse 的轻量级 UML 和 ER 图编辑器。 将AmaterasUML的3个jar包拷到Eclpise的plugins文件下&#xff1a; 重启eclipse 在新建菜单中可以发现已经出现了UML文件选项 安装GEF插件&#xff08;Eclipse2018-12 以后无需安装&#xf…

②电子产品拆解分析-电动牙刷

②电子产品拆解分析-电动牙刷一、功能介绍二、电路分析以及器件作用1、振动电机开关控制电路2、锂电池供电与充电电路三、本产品的优缺点1、优点&#xff1a;2、缺点&#xff1a;一、功能介绍 ①5档工作模式&#xff1b;②2分钟倒计时停止工作&#xff1b;③工作续航一个星期以…

【MySQL】详解索引操作

索引什么是索引&#xff1f;索引的优势和劣势索引类型按数据结构分类按物理存储分类按字段特性分类主键索引唯一索引普通索引全文索引前缀索引按字段个数分类索引操作创建索引创建主键索引唯一索引的创建普通索引的创建全文索引的创建explain工具查询索引删除索引索引最好设置为…

SQL 注入学习路线

学习路线&#xff08;大致&#xff09; HTML > SQL > Python > SQL 注入&#xff08;使用 sqli-labs 靶场来学习 SQL 注入&#xff09; HTML 视频 【前端开发入门教程&#xff0c;web前端零基础html5 css3前端项目视频教程】 要求 使用该视频进行 HTML 基础部分…

Python之字符串的特点

1.布尔值 Python2中没有布尔值&#xff0c;直接用数字0表示Flase&#xff0c;用数字1表示True。Python3中&#xff0c;把True和False定义成了关键字&#xff0c;但他们的本质还是1和0&#xff0c;甚至可以和数字相加。 >>> a True >>> b 3 >>> …

[多图,秒懂]如何训练一个“万亿大模型”?

1. 背景近几年&#xff0c;随着“大模型”概念的提出&#xff0c;深度学习模型越来越大&#xff0c;如何训练这些大模型成为一个亟待解决的工程问题。最初的视觉模型只有几百兆的参数量&#xff0c;而现在的语言模型中&#xff0c;动则百亿&#xff0c;千亿的参数量&#xff0c…

[golang工作日记] for range 踩坑

1、for range指针赋值 Ops的数据保存在两个表中&#xff0c;一个是ops_tab&#xff0c;另一个是staff_tab&#xff0c;其中ops_tab的staff_id是staff_tab的外键&#xff0c;两个表都有staff_id字段。 type OpsDetail struct {OpsId stringStaffId stringOps *model.Ops…