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

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

类型 值大小(byte) 对象内存大小(byte) 备注
byte 1 16
char 2 16
int 4 16
float 4 16
long 8 24
double 16 24

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

环境 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,Redis中的BitMap结构和Java中的BitSet功能差不多,但是BitMap占用空间更少

bitset空间大小速查表

bit空间大小速查表
最大ID byte MB
1000 168
10000(万) 2088 0.001
100000(十万) 16424 0.015
500000 (五十万) 65576 0.06
1000000 (一百万) 131112 0.125
5000000 (五百万) 1048616 1
10000000(一千万) 2097192 2
50000000(五千万) 8388648 8
100000000(亿) 16777256 16

Java对象内存空间大小计算相关推荐

  1. java中各种类型所占内存空间大小

    一.常用类型占用内存大小 java中常用类型所占内存大小,以下值以实测为准. 类型 数量 大小 备注 byte 1 1B byte 1024 1KB int 1 4B int 1024 4KB boo ...

  2. Java对象内存结构

    转载自 Java对象内存结构 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中 ...

  3. JOL(java object layout): java 对象内存布局

    我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...

  4. linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])

    linux 64位内存空间大小?(linux 64 bits memory space size? [closed]) 在Linux 32bit中,内核占用1GB的内存,而用户空间将占用剩余的gigs ...

  5. java对象内存布局中的基本类型字段排列顺序

    java对象内存布局: mark word(记录hashCode值和锁的标识等等) class对象指针 类字段 补齐位 如果是数组对象,2.3之间应该加上  数组长度 布局排列表: 32位jdk 普通 ...

  6. openjdk jol 工具打印 Java 对象内存布局

    1.maven 依赖 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-cor ...

  7. C++ 关于指针变量所占内存空间大小的问题

    #include <iostream> #include <stdlib.h>using namespace std;/**************************** ...

  8. JOL(java object layout --java 对象内存布局)

    JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址

  9. Java对象内存大小计算

    背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...

最新文章

  1. 宏基因组理论教程7挖掘微生物组生物标记
  2. 2021年春季学期-信号与系统-第十一次作业参考答案-第九小题
  3. tf.data.Dataset 用法
  4. vue的插值语法及el和data、methods语法释义
  5. Boost:显示如何将累加器持久化到文件中
  6. 工作161:eachart渲染步骤
  7. leetcode141 环形链表
  8. HLSL-高级着色语言简介【转】
  9. 使用window自带的截图工具
  10. fpga烧写bin文件_S3C2440移植uboot之编译烧写uboot
  11. 用 js判断 一个数是否是素数(质数)_Javascript 判断一个数是不是素数
  12. pageadmin CMS网站建设教程:模板中如何实现信息数据共享
  13. 《码农翻身》总结整理
  14. 使用卷积神经网络进行图片分类 2
  15. YOLOv5桌面应用开发,手把手教学实操(上)——附源代码
  16. MySQL组件和数据结构
  17. c语言作业素数探求实验题,c语言课程设计-素数探求.doc
  18. greedy、reluctant和possessive量词
  19. 元宇宙中国江湖进化录
  20. MATLAB连接USRP实现数据采集

热门文章

  1. 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...
  2. 迅雷7 down.php,帝国CMS教程:教你如何添加迅雷下载
  3. HTTP 响应行及响应状态码
  4. #前端# 如何获取你的token?
  5. jsp_servlet【基础】
  6. Vue 使用jsPlumb 实现连线绘图
  7. egret(白鹭引擎) 学习历程(二)
  8. 《CSDN/TUP 系列活动:我们的开源》学习
  9. 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
  10. android gif编辑,GIF编辑