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;}
一个文件让你搞明白对象占用内存的大小
最新推荐文章于 2024-08-13 00:33:41 发布