为什么不能在托管环境中测量对象的大小?

阿里·扎希德(Ali Zahid)

因此,stackoverflow上存在一个问题的多种变体,询问如何测量对象的大小(例如this)。答案指出了一个事实,即无需过多阐述,这是不可能的。有人可以详细解释为什么不可能或为什么测量物体大小没有意义吗?

韦罗

我想从标签中询问有关Java和C#中对象大小的度量的问题。对C#不太了解,因此以下内容仅适用于Java。

单个对象的浅大小和保留大小之间也存在差异,我想您正在询问浅大小(这将是得出保留大小的基础)。

我还解释了术语托管环境,即您只想在特定的JVM中运行时知道对象的大小(例如,不仅仅考虑源代码来计算大小)。

我的简短回答是:

  • 它是否有意义,以测量物体的大小?是的,它确实。任何在内存限制下运行的应用程序开发人员都乐于了解类布局和对象分配的内存含义。
  • 它是不可能在托管环境来衡量?不它不是。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在Python中创建这样的对象?

来自分类Dev

为什么不能在函数中实例化对象

来自分类Dev

为什么不能在VMware上运行oVirt托管引擎?

来自分类Dev

为什么不能在伪生成器(AddMethod)中修改构造环境?

来自分类Dev

为什么不能在语言环境中设置LC_ALL的值?

来自分类Dev

为什么不能在GHC中定义:=?

来自分类Dev

为什么我不能在Swift中更改视图的框架大小?

来自分类Dev

为什么不能在新的初始化程序中忽略数组大小?

来自分类Dev

为什么我不能在C中检查结构的大小?(未声明的错误)

来自分类Dev

为什么不能在JPanel上调整JButton的大小或位置?

来自分类Dev

为什么不能在Java中其他类的方法中创建类对象?

来自分类Dev

为什么代码不能在VB.net中工作,而可以在VBA中工作?获取对象

来自分类Dev

为什么不能在Java中将<ParentInterface>类型的对象存储在<ChildInterface>类型的容器中?

来自分类Dev

为什么我不能在C#中为对象分配null?

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我不能在ClojureScript中访问此JS对象的道具?

来自分类Dev

为什么我不能在状态中存储对象数组:React JS

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我不能在类定义中实例化同一类的对象

来自分类Dev

为什么我不能在我的节点应用程序中重命名这个对象?

来自分类Dev

为什么我不能在函数内部创建数组对象?

来自分类Dev

为什么不能在平台之间移动对象(.obj)文件?

来自分类Dev

为什么不能在unittest中直接模拟对象?

来自分类Dev

为什么不能在QLineEdit对象中使用StyleSheet?

来自分类Dev

为什么不能在 jpa 中保存对象

来自分类Dev

为什么不能在默认对象中导出函数

来自分类Dev

为什么swiftui不能区分2个不同的环境对象?

来自分类Dev

为什么我不能在“登录”和“注册”代码中更改个人资料图片的大小?

来自分类Dev

为什么eval不能在bash中的函数中声明?

Related 相关文章

  1. 1

    为什么我不能在Python中创建这样的对象?

  2. 2

    为什么不能在函数中实例化对象

  3. 3

    为什么不能在VMware上运行oVirt托管引擎?

  4. 4

    为什么不能在伪生成器(AddMethod)中修改构造环境?

  5. 5

    为什么不能在语言环境中设置LC_ALL的值?

  6. 6

    为什么不能在GHC中定义:=?

  7. 7

    为什么我不能在Swift中更改视图的框架大小?

  8. 8

    为什么不能在新的初始化程序中忽略数组大小?

  9. 9

    为什么我不能在C中检查结构的大小?(未声明的错误)

  10. 10

    为什么不能在JPanel上调整JButton的大小或位置?

  11. 11

    为什么不能在Java中其他类的方法中创建类对象?

  12. 12

    为什么代码不能在VB.net中工作,而可以在VBA中工作?获取对象

  13. 13

    为什么不能在Java中将<ParentInterface>类型的对象存储在<ChildInterface>类型的容器中?

  14. 14

    为什么我不能在C#中为对象分配null?

  15. 15

    为什么我们不能在构造函数中创建非静态自引用对象

  16. 16

    为什么我不能在ClojureScript中访问此JS对象的道具?

  17. 17

    为什么我不能在状态中存储对象数组:React JS

  18. 18

    为什么我们不能在构造函数中创建非静态自引用对象

  19. 19

    为什么我不能在类定义中实例化同一类的对象

  20. 20

    为什么我不能在我的节点应用程序中重命名这个对象?

  21. 21

    为什么我不能在函数内部创建数组对象?

  22. 22

    为什么不能在平台之间移动对象(.obj)文件?

  23. 23

    为什么不能在unittest中直接模拟对象?

  24. 24

    为什么不能在QLineEdit对象中使用StyleSheet?

  25. 25

    为什么不能在 jpa 中保存对象

  26. 26

    为什么不能在默认对象中导出函数

  27. 27

    为什么swiftui不能区分2个不同的环境对象?

  28. 28

    为什么我不能在“登录”和“注册”代码中更改个人资料图片的大小?

  29. 29

    为什么eval不能在bash中的函数中声明?

热门标签

归档