节前回顾

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>

java内存计算工具类(3种)_java

/**
     * 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;
    }

java内存计算工具类(3种)_内存计算_02

测试方法

public static void main(String[] args) {
//        Object o = new Object();
        List<Long> o = new ArrayList<>();
        o.add(1234L);
        getTotalMemory(o);
        jolGetTotalMemory(o);
        luceneGetTotalMemory(o);
    }

java内存计算工具类(3种)_java_03