【问题标题】:Serialized object size vs in memory object size in JavaJava中的序列化对象大小与内存对象大小
【发布时间】:2011-11-01 01:44:19
【问题描述】:

有没有办法从 Java 中的序列化对象大小(大致)估计内存对象大小

【问题讨论】:

标签: java memory serialization


【解决方案1】:

内存中的大小通常在可序列化大小的一半到两倍之间。最极端的例子可能是 80 字节以上的 Byte 序列化在内存中可以是 16 字节。

您可以使用分析器来告诉您一个对象使用了多少内存。另一种方法是使用基于Instrumentation.getObjectSize(object)的工具

你可能会觉得这个很有趣Getting the size of an Object

【讨论】:

  • 有趣,为什么字节如此不同。它比内存大五倍。你有任何参考链接吗? +1
  • 序列化使用标准格式,带有标头、编码的类及其父级。与其尝试阅读有关 Java 序列化内部表示的指南(我不相信它是一个开放标准),不如通过尝试了解更多信息。
  • 为此,您需要确定每个值/字段的编码方式,在这种情况下,您应该能够计算编码值的大小。这不会让您知道标头有多大,或者分配的内存对齐的影响。
  • 一个 byte[] 使用大约 12 个字节加上 length。大多数 JVM 都是 8 字节对齐的,因此您需要四舍五入到接下来的 8 个字节。
  • @krumpelstiltskin 一个简单的例子是一个字符串,它在序列化时使用 UTF-8 编码。一个长的 ASCII 字符字符串将是每个字符 1 个字节(加上一个固定大小的标头),但是在内存中它将是每个字符一个字符(2 个字节)(除非使用压缩字符串)
【解决方案2】:

这个挑战的一个非常好的工具: https://github.com/jbellis/jamm

来自 readme.txt:

MemoryMeter 与 java.lang.instrument.Instrumentation.getObjectSize,它只声称 提供“近似”结果,但在实践中似乎可以作为 预计。

MemoryMeter 使用反射来抓取对象图以获取 measureDeep。 反射很慢:测量一百万个物体 Cassandra Memtable (即 MemoryMeter.countChildren 中的 100 万个孩子) 大约 5 秒挂钟时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2011-01-04
    • 2016-09-17
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多