sizeof Java object

54 浏览
0 Comments

sizeof Java object

这个问题已经在此处有答案:

如何确定Java对象的大小

我们如何找出Java对象的大小?

例如:

class Person{
    String name;  
    int age;  
    public Person(String n, int a){  
        name = n;  
        age = a;  
    }
}  
Person person = new Person("Andy", 30);  

我如何知道person对象的大小?

admin 更改状态以发布 2023年5月21日
0
0 Comments

我认为如果你这样做,你可以得到一些有用的东西:

    /* First trigger classloading */
    MyObject delegate = new MyObject();
    Runtime.getRuntime().gc();
    long before = Runtime.getRuntime().freeMemory();
    MyObject delegate2 = new MyObject();
    long after = Runtime.getRuntime().freeMemory();
    System.out.println("Memory used:"+(before-after));

这有望为你提供你想要的答案,或者至少是一个近似值。

0
0 Comments

不加更多上下文,这个问题是没有意义的。

在Java中,“大小”这个概念只能对原始数据类型(primitives)给出一个合理的定义:一个字节是8位(毫不意外),一个int是32位,一个long是64位,等等(详见例如http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)。对于对象实例,情况会变得更为复杂,因为:

  • 对象实例内部可以(通常会)包含对其他实例的引用,因此你需要决定是否要将这些依赖实例计入其中,并考虑如何计算。如果几个实例之间共用一个依赖实例,那么该怎么办?
  • 有时候,对象实例可能会被重复使用(例如java.lang.String的interning,详见http://en.wikipedia.org/wiki/String_interning)。因此,如果你使用x个大小为y的对象,其总大小可能小于x*y。
  • JVM在内部实现对象和实例的时候有很多自由裁量权。对于不同的实例可能使用不同的技术(例如共享内部数据结构),因此可能根本没有一个有意义的“大小”可以赋予单个对象。

也许你能解释一下为什么你对对象大小感兴趣。

估算实例使用的堆内存有一些经验法则(例如,在Sun JVM中,一个java.lang.Object实例使用8字节),但这些法则取决于所用的JVM。

通常情况下,如果你想了解自己的堆使用情况,最好使用内存/堆分析工具。

编辑:

嗯,(至少从JDK 6开始)有一种方法可以获得对象占用的内存数量的近似值:http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

但这仍然只是一个近似值……

0