我使用下面的java项目来确定对象http://sizeof.sourceforge.net/的大小
public class DataClass /*implements Serializable*/{
// private static final long serialVersionUID = 5199373516861766638L;
String name = "GUNJ";
String lastName= "";
// int age = 148888890;
@Override
public String toString() {
return "DataClass{" +
"Name='" + name + '\'' +
", Last Name='" + lastName + '\'' +
", Age=" +
'}';
}
public static void main(String[] args) {
// SizeOf.skipStaticField(true);
// SizeOf.skipFinalField(true);
// SizeOf.skipFlyweightObject(true);
System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(new DataClass()))); //this will print the object size in bytes
}
}我得到的结果如下144 as,64 as,72 as
它似乎在使用Java工具代码
似乎正在使用以下软件包: java.lang.instrument.Instrumentation
但不确定包的API是返回对象大小(以位还是字节为单位)。
发布于 2014-12-05 14:51:15
这个工具似乎有点过时了。作为另一种选择,我可以推荐优秀的约尔,它现在已经在OpenJDK下发布了。它甚至比sizeOf更好,并且支持许多很酷的特性。还可以查看Shipilev的博客文章,它演示了该工具的使用。
发布于 2014-12-05 13:53:58
您指出的链接指出:
Use the humanReadable() method to get the object size in byte, kilo or mega (if you need giga your in trouble guy!):
所以它似乎不是零碎的。
关于你的第二个问题,我没有答案。我猜String使用的缓冲区的大小大于字符串的大小,因此您可以在缓冲区的大小增长之前添加几个字符。
发布于 2015-01-05 16:51:36
我不相信对于这么小的物体你会得到“144‘t,64’t,72‘t”这样的结果。您很可能得到了144.0b、64.0b和72.0b。
已链接的页面已经毫不怀疑地说:
System.out.println(SizeOf.deepSizeOf());//这将以字节打印对象大小
如果您对SizeOf.humanReadable做什么持怀疑态度,您可以简单地省略它的调用,直接打印SizeOf.deepSizeOf的结果。
因为skipStaticField、skipFinalField、skipFlyweightObject是三个标志,因此允许八个组合,但是您只发布了三个结果而没有告诉您使用的组合,所以很难解释结果。特别是,由于String的实现在Java版本之间发生了变化,并且您没有指定使用的Java。
当指定skipFlyweightObject时,像源代码中的文字String那样的String不算在内。当没有指定skipFinalField时,就会考虑String的平面对象存储,但是当使用final字段引用它时,会忽略它的char[]内容。如果计算了所有的char,则必须考虑大多数实现都有一个对象大小填充,在报告对象大小时可能会考虑这个填充。
看起来,对于Oracle的JVM,每个对象都有一个对象大小为8个字节的倍数。因此,在UTF-16数组的对象大小增加到下一个8个字节的倍数之前,您可能会添加多达4个char字符。
您可以使用SizeOf.turnOnDebug();来了解如何计算对象大小。但是,您应该始终记住,这样的累积大小可能包括在不同对象图之间共享的对象,因此与实际使用的堆存储相比,这些对象的大小加起来要大得多。
还请考虑Instrumentation.getObjectSize (这个SizeOf类的后端)是怎么说的:
返回指定对象消耗的存储量的特定于实现的近似。结果可能包括部分或全部对象的开销,因此对于在实现中进行比较非常有用,而不是在实现之间进行比较。在JVM的单个调用过程中,估计值可能会发生变化。(我强调)
https://stackoverflow.com/questions/27317185
复制相似问题