Java对象内存空间大小计算

news2024/10/7 18:30:36

一、查看基础类型的对象内存大小

八股文中很明确的告诉你了基础类型的大小 ,如下图:

类型值大小(byte)对象内存大小(byte)备注
byte116
char216
int416
float416
long824
double1624

很明显基础类型值的大小和内存大小不一致,所以计算也不能混淆,这里我们着重弄懂对象大小怎么去计算;

环境 Win10系统64位,JDK8(1.6版本之后默认开启了指针压缩)

方式1:

 我们用jdk debug包的工具jdk.nashorn.internal.ir.debug.ObjectSizeCalculator去获取Java对象大小

方式2:

用三方工具包

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.13</version>
</dependency>

这里我们用方式1实验:

 int, float等基础都类型都是以对象的方式存在于内存中,且空对象大小为16byte,看看对象的结构,因HotSpot JVM规范要求对象起始地址必须是8字节的整数倍,所以空对象为16byte

二、分析String字符串对象内存大小 

明白了这个之后我们再来探究一下字符串的内存空间大小

举例 String s ="hello";

我们发现空字符串占40byte, 而"hello"占56byte, char[] 占32byte

我们利用jol-core工具包里面的 ClassLayout.parseInstance(“**”).toPrintable() 看看结构

char[]的对象结构 对象头16byte+10byte(hello)+ 对齐填充6byte = 32byte

String="hello" 12byte对象头+4byte数组指针+4byte hash值+对齐填充4byte =24byte + 32byte数组值 = 56byte 

所以空字符串 有24byte基础+16byte char[] = 40byte

三、BitSet内存大小计算

除了常见的字符串很好计算大小,但是在选择k-v存储还是bitset存储通常需要做一下大小计算,这个问题在redis中很常见,我们先用Java做计算

1亿个用户签到问题,例如id区间[100000000,200000000]

选择K-V方式 :

1亿个K用Integer对象存入 10^9*16byte/1024/1024 > 1500MB ,还不算Value的空间

选择BitSet,BitSet空对象 48byte,但是内部是由一个可扩展的long[]维护比特位转化而成的整数

1-63放入word[0],64-127放入word[1],....... 依次类推达到2*10^9的时候大概是32MB,假设你只有少量的数存贮而且maxId很大,那么依然会有这么大的空间占用,而K-V方式则占用较少,由于用户ID 10^9以下的都没有用过所以可以将ID偏移减去10^9个数,这样的话 maxId = 2*10^9-10^9 = 10^9 存储空间减少一半为16MB

bitset空间大小速查表

bit空间大小速查表
最大IDbyteMB
1000168
10000(万)20880.001
100000(十万)164240.015
500000 (五十万)655760.06
1000000 (一百万)1311120.125
5000000 (五百万)10486161
10000000(一千万)20971922
50000000(五千万)83886488
100000000(亿)1677725616

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

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

相关文章

从入门到精通,收下这 22 个 Python 学习网站

今天一并给大家整理推送&#xff0c;希望能帮你在这条道路上&#xff0c;走得更顺畅&#xff0c;走得更远&#xff0c;更稳… 0. 学习整体思路 我做为一个过来人&#xff0c;有一些经验想要分享&#xff1a; 前期&#xff1a;花点时间选一门口碑上佳的入门电子文字教程&…

大数据:数据策略之CAP理论和BASE理论

一、CAP 理论 1.1 基本概念 1. 一致性 在分布式环境中&#xff0c;一致性是指数据在多个节点之间能够保持一致的特性。如果在某个节点上执行变更操作后&#xff0c;用户可以立即从其他任意节点上读取到变更后的数据&#xff0c;那么就认为这样的系统具备强一致性。 2. 可用…

使用OpenCV的函数hconcat()、vconcat()实现图像或矩阵的连接

使用OpenCV的函数hconcat()、vconcat()实现图像或矩阵的连接 函数hconcat()在水平方向上连接图像或矩阵&#xff1b; 函数vconcat()在垂直方向上连接图像或矩阵。 两个函数的原型和使用方法一模一样&#xff0c;所以在下面的函数原型介绍中&#xff0c;只介绍函数hconcat()的…

C++ std::nothrow

我们知道&#xff0c;当我们写程序时&#xff0c;栈区的内存是非常小的&#xff0c;如果是写那种大型的项目&#xff0c;不够用是很正常的&#xff0c;所以我们需要在堆区申请内存&#xff1b; 但是如果在堆区申请了大量的内存&#xff0c;导致没有空间了&#xff0c;那么程序…

刨根问底 Kubernetes -- CNI (三)Multus

文章目录Multus 概述Multus 使用Multus DaemonSet 的作用Multus 的使用Multus 的 处理1. 从 input 加载 netConf, 将 cni 配置加载到 netConf.Delegates2. 加载委托插件&#xff08;delegate&#xff09;并将其添加至 multus 配置2.1. 尝试解析 Pod 注解中 multus 配置2.2. 获取…

实践案例丨CenterNet-Hourglass论文复现

摘要&#xff1a;本案例是CenterNet-Hourglass论文复现的体验案例&#xff0c;此模型是对Objects as Points 中提出的CenterNet进行结果复现。本文分享自华为云社区《CenterNet-Hourglass (物体检测/Pytorch)》&#xff0c;作者&#xff1a;HWCloudAI。 目标检测常采用Anchor的…

【正点原子FPGA连载】第二十七章 MDIO接口读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十七章 MDIO…

字典类型和字典函数、字典方法

字典类型 (无序&#xff0c;不能重复) 通过任意键信息查找一组数据中值信息的过程叫映射&#xff0c; Python语言中通过字典实现映射。 Python语言中的字典可以通过大括号({})建立&#xff0c;建立模式如下&#xff1a; {<键1>:<值1>,<键2>:<值2>,...,…

[附源码]Python计算机毕业设计SSM健身房管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

p15~p22基本链表容器和高级链表容器迭代器

STL一、自制链表容器/基本链表容器1.1 首/尾部增删节点1.2 获取首/尾部的元素1.3 清空链表7 / 判空链表 / 链表大小81.4 缺省构造0/拷贝构造10/析构函数91.5 输出流操作符重载二、迭代器原理2.1 迭代器概念2.2 迭代器的分类三、迭代器实现3.1 正向非常迭代类3.2 正向非常迭代器…

html旅游网站设计与实现——绿色古典旅游景区 HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

解析仓库管理系统对于企业的重要性

仓储管理的职责是有效的保存和管理仓库内的物资&#xff0c;这些物资是指仓库内所有的有形物品以及无形的资产。以前很多企业都是依靠人工方式对库房的管理&#xff0c;难免会造成一些难以解决的问题&#xff1a; 仓库种类太多&#xff0c;查看困难&#xff1b;仓库信息记录不…

Java应用程序安全框架

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建SpringBoot集成Mybatis项目实操SpringBoot集成MybatisPlus项目实操SpringBoot集成Spring Data JPA项目实操 数据库变更管理 数据库变更管理&#xff1a;Liquibase…

Word控件Spire.Doc 【图像形状】教程(11): 如何在 C# 中为 Word 中的图像设置 Transeperant 颜色

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

A-Level经济题解析及练习Policy options for Common Resources

今日知识点&#xff1a;Policy options for Common Resources 例题 There is a medieval town where sheep graze on common land. As the population grows, the number of sheep grows. However, the amount of land is fixed, the grass begins to disappear from overgra…

SwiftUI 中为什么应该经常用子视图替换父视图中的大段内容?

概览 在 SwiftUI 官方教程中&#xff0c;Apple 时常提出“化整为零”的界面布局思想。简单来说&#xff0c;Apple 推荐 SwiftUI 视图的构建方式是&#xff1a;用若干自定义小视图来构成上层的功能视图。 这是为什么呢&#xff1f; 在本篇博文中&#xff0c;我们将用一个通俗…

[Java反序列化]—CommonsCollections6

先贴个图 0x01: CC 6 应该是CC1 和 URLDNS 的综合&#xff0c;有一定联系&#xff0c;审一下吧 JDK版本需低于 8u71 AnnotationInvocationHandler类的readObject()方法在8u71以后逻辑就发生了改变&#xff0c;不能再利用了&#xff0c;所以就需要找一个绕过高版本的利用链…

Cadence Virtuoso Layout 版图绘制的使用技巧及其相关快捷键

1.版图前准备操作 画好原理图&#xff0c;打好pin脚&#xff08;pin最好以全大写的形式书写&#xff0c;以防后续操作中可能出现Bug&#xff09; 查看所使用工艺库的design rule文件&#xff0c;确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面…

JS 正则表达式常用方法

1. JS 正则表达式 2. 使用字符串方法 3. 使用 RegExp 方法 1. JS 正则表达式 JS 正则表达式语法: # JS 的正则表达式不需要使用引号包裹&#xff0c;PHP 需要使用引号包裹。修饰符是可选的&#xff0c;可写可不写/正则表达式主体/修饰符JS 中使用正则表达式的方法比较多&am…

【强化学习论文合集】九.2018AAAI人工智能大会论文(AAAI2018)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…