Java对象内存空间大小计算
一、查看基础类型的对象内存大小
八股文中很明确的告诉你了基础类型的大小 ,如下图:
类型 | 值大小(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空间大小速查表
最大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对象内存空间大小计算相关推荐
- java中各种类型所占内存空间大小
一.常用类型占用内存大小 java中常用类型所占内存大小,以下值以实测为准. 类型 数量 大小 备注 byte 1 1B byte 1024 1KB int 1 4B int 1024 4KB boo ...
- Java对象内存结构
转载自 Java对象内存结构 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中 ...
- JOL(java object layout): java 对象内存布局
我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...
- linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])
linux 64位内存空间大小?(linux 64 bits memory space size? [closed]) 在Linux 32bit中,内核占用1GB的内存,而用户空间将占用剩余的gigs ...
- java对象内存布局中的基本类型字段排列顺序
java对象内存布局: mark word(记录hashCode值和锁的标识等等) class对象指针 类字段 补齐位 如果是数组对象,2.3之间应该加上 数组长度 布局排列表: 32位jdk 普通 ...
- openjdk jol 工具打印 Java 对象内存布局
1.maven 依赖 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-cor ...
- C++ 关于指针变量所占内存空间大小的问题
#include <iostream> #include <stdlib.h>using namespace std;/**************************** ...
- JOL(java object layout --java 对象内存布局)
JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址
- Java对象内存大小计算
背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...
最新文章
- 宏基因组理论教程7挖掘微生物组生物标记
- 2021年春季学期-信号与系统-第十一次作业参考答案-第九小题
- tf.data.Dataset 用法
- vue的插值语法及el和data、methods语法释义
- Boost:显示如何将累加器持久化到文件中
- 工作161:eachart渲染步骤
- leetcode141 环形链表
- HLSL-高级着色语言简介【转】
- 使用window自带的截图工具
- fpga烧写bin文件_S3C2440移植uboot之编译烧写uboot
- 用 js判断 一个数是否是素数(质数)_Javascript 判断一个数是不是素数
- pageadmin CMS网站建设教程:模板中如何实现信息数据共享
- 《码农翻身》总结整理
- 使用卷积神经网络进行图片分类 2
- YOLOv5桌面应用开发,手把手教学实操(上)——附源代码
- MySQL组件和数据结构
- c语言作业素数探求实验题,c语言课程设计-素数探求.doc
- greedy、reluctant和possessive量词
- 元宇宙中国江湖进化录
- MATLAB连接USRP实现数据采集
热门文章
- 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...
- 迅雷7 down.php,帝国CMS教程:教你如何添加迅雷下载
- HTTP 响应行及响应状态码
- #前端# 如何获取你的token?
- jsp_servlet【基础】
- Vue 使用jsPlumb 实现连线绘图
- egret(白鹭引擎) 学习历程(二)
- 《CSDN/TUP 系列活动:我们的开源》学习
- 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
- android gif编辑,GIF编辑