如何计算java对象所占内存大小,可以使用下述三种方法。
使用jdk8自带API
使用下面语句打印对象所占内存大小:需要保证jdk版本是jdk8。
System.out.println(ObjectSizeCalculator.getObjectSize(3L));
借助org.apache.lucene工具类
引入maven坐标
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
// 使用jdk8自带API
System.out.println("List内存占用大小="+ ObjectSizeCalculator.getObjectSize(map)+"字节");
System.out.println("List占用的内存大小为:" + new BigDecimal(ObjectSizeCalculator.getObjectSize(map)).divide(new BigDecimal(1024*1024))+ "MB");
借助jol工具类
引入maven坐标
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
System.out.println(ClassLayout.parseInstance(map).toPrintable());
不过这种当对象中内嵌其他对象时,只能计算ClassLayout方法中这个object对象所占内存的大小。
完整代码如下:
import lombok.Data;
import java.io.Serializable;
/**
* @author Evan Walker
* @version 1.0
* @desc
* @date 2024/02/20 09:38:43
*/
@Data
public class ClassEntity implements Serializable {
private String acctId;
private String classTag1;
private String classTag2;
private String classTag3;
}
import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;
import org.apache.lucene.util.RamUsageEstimator;
import org.openjdk.jol.info.ClassLayout;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @author Evan Walker
* @version 1.0
* @desc
* @date 2024/02/20 09:37:48
*/
public class Test {
public static void main(String[] args) throws Exception{
Map<String,ClassEntity> map = new HashMap();
for(int i = 0;i<1000000;i++){
ClassEntity entity = new ClassEntity();
entity.setClassTag1("A");
entity.setClassTag2(i+"bbb");
entity.setClassTag3(i+"ccc");
map.put(i+"@12345678",entity);
}
// 借助org.apache.lucene工具类
System.out.println("List内存占用大小="+ RamUsageEstimator.humanSizeOf(map));
// 使用jdk8自带API
System.out.println("List内存占用大小="+ ObjectSizeCalculator.getObjectSize(map)+"字节");
System.out.println("List占用的内存大小为:" + new BigDecimal(ObjectSizeCalculator.getObjectSize(map)).divide(new BigDecimal(1024*1024))+ "MB");
// 借助jol工具类
System.out.println(ClassLayout.parseInstance(map).toPrintable());
}
}
上述便是三种打印java 对象占用内存的方法。
更多消息资讯,请访问昂焱数据。