在 Java 中计算对象的大小

我想记录一个对象为一个项目占用了多少内存(希望以字节为单位)(我正在比较数据结构的大小),而且在Java中似乎没有方法可以做到这一点。据推测,C/C++有方法,但这在Java中并不存在。我尝试在创建对象之前和之后在JVM中记录可用内存,然后记录差异,但它只会给出0或131304,而两者之间没有任何结果,无论结构中的元素数量如何。请帮忙!sizeOf()Runtime.getRuntime().freeMemory()


答案 1

您可以使用 java.lang.instrumentation 包。

它有一个方法,可用于获取对象大小的实现特定近似值,以及与对象关联的开销。

谢尔盖链接的答案有一个很好的例子,我会在这里重新发布,但你应该已经从他的评论中看到了:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

用:getObjectSize

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
    }
}


答案 2

看看 https://github.com/DimitrisAndreou/memory-measurer
Guava在内部使用它,并且开箱即用,没有任何特殊的命令行参数,使用起来特别简单。ObjectGraphMeasurer

import objectexplorer.ObjectGraphMeasurer;

public class Measurer {

  public static void main(String[] args) {
    Set<Integer> hashset = new HashSet<Integer>();
    Random random = new Random();
    int n = 10000;
    for (int i = 1; i <= n; i++) {
      hashset.add(random.nextInt());
    }
    System.out.println(ObjectGraphMeasurer.measure(hashset));
  }
}

推荐