如何计算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自带APISystem.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自带APISystem.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 对象占用内存的方法。
更多消息资讯,请访问昂焱数据。