首页  

java对象内存占用大小计算     所属分类 java 浏览量 2139
三种方式
Instrumentation
Unsafe
第三方工具类 Lucene RamUsageEstimator

1 Instrumentation
      
java.lang.instrument.Instrumentation.getObjectSize() ,计算运行时对象的大小,返回该对象本身及其间接引用的对象在内存中的大小。
实现类InstrumentationImpl 构造方法是私有的,创建时,需要依赖一个nativeAgent,和运行环境所支持的一些预定义类信息,
无法在代码中无接实例化,需要在JVM启动时,通过指定代理的方式,让JVM来实例化。

public class SizeTool {
    private static Instrumentation instrumentation;
 
    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }
 
    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

MANIFEST.MF

Manifest-Version: 1.0
Main-Class: dyyx.tools.Main
Premain-Class: dyyx.tools.SizeTool

java -javaagent:dyyxtools.jar -jar app.jar


2 使用 Unsafe
  Unsafe.objectFieldOffset()
  
  可以计算出对象头的大小(即第一个字段的偏移)及每个字段的偏移。
  Unsafe通常禁止开发者直接使用,需要通过反射获取其实例,另外,最后一个字段的大小需要手工计算。
  其次需要手工写代码递归计算才能得到对象及其所引用的对象的综合大小,比较麻烦。
 

3 第三方工具类 Lucene RamUsageEstimator

org.apache.lucene:lucene-core:4.0.0

RamUsageEstimator 根据java对象在堆内存中的存储格式,通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。
在初始化的时候会根据当前JVM运行环境、CPU架构、运行参数、是否开启指针压缩、JDK版本等综合计算对象头的大小,而实例数据部分则按照java基础数据类型的标准大小进行计算。

https://gitee.com/dyyx/hellocode/blob/master/web/code/RamUsageEstimator.java

上一篇     下一篇
netty高性能要点

redis要点整理

从高级程序员到CTO

spring循环依赖

Java实用工具类

mysql索引失效的几种情况