因此,stackoverflow上存在一个问题的多种变体,询问如何测量对象的大小(例如this)。答案指出了一个事实,即无需过多阐述,这是不可能的。有人可以详细解释为什么不可能或为什么测量物体大小没有意义吗?
我想从标签中询问有关Java和C#中对象大小的度量的问题。对C#不太了解,因此以下内容仅适用于Java。
单个对象的浅大小和保留大小之间也存在差异,我想您正在询问浅大小(这将是得出保留大小的基础)。
我还解释了术语托管环境,即您只想在特定的JVM中在运行时知道对象的大小(例如,不仅仅考虑源代码来计算大小)。
我的简短回答是:
长答案:
不能仅从类定义中得出对象大小的原因有很多,例如:
Java语言规范仅给出了基本类型的下限内存要求。Aint
占用至少4个字节,但实际大小取决于VM。
不确定语言规范如何说明引用的大小。JVM中可能的对象数量是否受到任何限制(这将影响对象引用的内部存储大小)?当今的JVM使用4个字节作为参考指针。
JVM可以(并且确实)填充对象字节以在某个边界处对齐,这可能会扩展对象的大小。当今的JVM通常将对象内存对齐到8字节边界。
但是所有这些原因都不适用于使用实际内存布局的JVM运行时,最终允许其世代垃圾收集器将对象推入周围,因此必须能够报告对象大小。
那么我们如何知道运行时的对象大小呢?在Java 1.5中,我们得到了java.lang.instrument.Instrumentation#getObjectSize(Object)
。Javadoc说:
返回指定对象消耗的特定于实现的近似值。结果可能包括对象的部分或全部开销,因此对于实现内部的比较有用,但对于实现之间的比较有用。在JVM的一次调用期间,估计值可能会发生变化。
带着一粒盐的读数告诉我,有一种合理的方法可以在运行时的一点上获得对象的确切浅大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句