一个文件让你搞明白对象占用内存的大小

package com.util;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.openjdk.jol.info.ClassLayout;

import java.io.*;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
 * @author yangguang
 * @time  2021/9/30 0030 17:28
 * @description 对象内存大小测试
 */
public class Test2 {
    public static void main(String[] args) throws InterruptedException, Exception {
        /**
         * 对象分为
         *      对象头
         *          对象头包括两部分  markDown,和 对象指针(对象对应的内存地址),如果是数组还有第三部分,数组的长度
         *          默认64位系统开启对象头压缩,两部分都占用4字节,一共8字节,不开启每个对象占用8字节,数组长度int占4字节
         *      实际数据
         *          实际数据包括基本数据类型和引用数据类型
         *              基本数据类型占用
         *                  byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,
         *              引用数据类型 其实就是引用地址,reference占用4个字节
         *      对齐填充
         *          主要是因为HotSpot虚拟机的内存管理要求对象的大小必须是8字节的整数倍,而对象头正好是8个字节的整数倍,但是实例数据不一定,所以需要对齐填充补全
         */
        //对象头8,实际数据为int 4,没有引用,8+4=12  不是8的倍数。填充4字节,一共16字节
        int a=1;System.out.println(ObjectSizeCalculator.getObjectSize(a));
        //数组对象占用大小为   对象头12字节 字节数组长度为0,则0字节,没有引用,  补齐16字节
        Byte[] bytearr=new Byte[0];
        System.out.println(ObjectSizeCalculator.getObjectSize(bytearr));
        //数组对象占用大小为   对象头12字节 字节数组长度为1,则4字节,没有引用,  补齐24字节
        Byte[] bytearr2=new Byte[1];
        System.out.println(ObjectSizeCalculator.getObjectSize(bytearr2));
        //String里有三个属性,一个int,一个数组,一个long
        //对象头8字节,int 4字节 long 8字节,数组是引用4字节  一共  8+4+8+4=24字节
        //数组对象占用大小为   对象头12字节 字节数组长度为0,则0字节,没有引用,  补齐16字节
        //一共 24+16=40
        String b="";System.out.println(ObjectSizeCalculator.getObjectSize(b));
        //对象头8字节,
        System.out.println(ObjectSizeCalculator.getObjectSize(new Demo()));
    }
}
class Demo {private int a = 1;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值