• Java对象内存空间大小计算


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

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

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

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

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

    方式1:

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

    方式2:

    用三方工具包

    1. <dependency>
    2. <groupId>org.openjdk.jol</groupId>
    3. <artifactId>jol-core</artifactId>
    4. <version>0.13</version>
    5. </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空间大小速查表
    最大IDbyteMB
    1000168
    10000(万)20880.001
    100000(十万)164240.015
    500000 (五十万)655760.06
    1000000 (一百万)1311120.125
    5000000 (五百万)10486161
    10000000(一千万)20971922
    50000000(五千万)83886488
    100000000(亿)1677725616

  • 相关阅读:
    操作系统级 ChatGPT 爆火!
    elasticsearch api 调用
    visual studio解决bug封装dll库
    【项目管理/PMP/PMBOK第六版/第七版/新考纲】PMP错题解析 | 沟通管理计划、变更请求、审计、激励、培训、Y理论、团队建设、风险登记册、项目章程
    leetcode做题笔记165. 比较版本号
    python 通过图片(原图)精确获取图片拍摄的位置
    1.nodejs--http模块、fs模块、控制台常用指令
    前期学习练习测试
    Qwt开发笔记(二):Qwt基础框架介绍、折线图介绍、折线图Demo以及代码详解
    PHP调试 - XDebug
  • 原文地址:https://blog.csdn.net/u014618954/article/details/128188150