节前回顾
java最小单位 字节bit
关系 1byte = 8bit 1024bit = 1K 1024K = 1M 1024M = 1G 1024G = 1T
在一些开发场景,我们需要计算对象的大小时,可以使用以下的工具类。
三种计算内存的小工具类
- JDK自带内存计算工具类
- JOL,JOL的内容相对更丰富,可以看到实体里的更多细节
- LUCENE
以下是代码实现,需要引入Maven依赖
<!--jol内存计算工具 -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
<!-- lucene -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.0.0</version>
</dependency>
/**
* JDK自带内存计算工具
* */
public static long getTotalMemory(Object obj) {
System.setProperty("java.vm.name","Java HotSpot(TM) ");
long totalMemory = ObjectSizeCalculator.getObjectSize(obj);
System.out.println("getTotalMemory getObject memory : " + totalMemory);
return totalMemory;
}
/**
* jol内存计算
* */
public static long jolGetTotalMemory(Object obj) {
String printLog = ClassLayout.parseInstance(obj).toPrintable();
System.out.println(printLog);
long totalMemory = ClassLayout.parseInstance(obj).getLossesTotal();
System.out.println("jolGetTotalMemory getObject memory : " + totalMemory);
return totalMemory;
}
/**
* lucene内存计算
* */
public static long luceneGetTotalMemory(Object obj) {
//统计字节
long totalMemory = RamUsageEstimator.sizeOf(obj);
System.out.println("luceneGetTotalMemory getObject memory : " + totalMemory);
//带最大单位统计
// System.out.println(RamUsageEstimator.humanSizeOf(map));
// System.out.println(RamUsageEstimator.humanSizeOf(1));
return totalMemory;
}
测试方法
public static void main(String[] args) {
// Object o = new Object();
List<Long> o = new ArrayList<>();
o.add(1234L);
getTotalMemory(o);
jolGetTotalMemory(o);
luceneGetTotalMemory(o);
}