【问题标题】:Java - easy way to inspect structure of serialized object?Java - 检查序列化对象结构的简单方法?
【发布时间】:2012-06-20 03:11:11
【问题描述】:

我有一个类,我想看看当这个类中的对象被序列化时哪些子对象占用的空间最多。除了查看代码并手动分析之外,有什么好的工具/方法可以做到这一点?

例如我想让工具说“成员 a 占 20%,b 30%,成员 c 占 50%”。

谢谢

附:我找到了一些相关的问题,但没有找到我的具体问题的答案。

【问题讨论】:

  • 查看我对#alexey28 的评论——我对序列化对象的结构感兴趣,而不是内存中对象的结构
  • java 中没有“子对象”。这不是语义问题。如果一个对象的两个成员本身有共同的成员,你如何计算份额?

标签: java serialization


【解决方案1】:

唯一相对快速的计算对象大小的方法是先写入整个对象,计算使用情况(例如,写入 ByteArrayOutputStream),然后写入每个引用的对象。

需要考虑以下几点:

  • ObjectOutputStream 确实进行了一些缓存,以便能够使用简单的指针引用先前写入的对象。使用 reset() 方法清除此缓存。
  • 每个写入的新对象类型首先都有类描述。其开销取决于您引用的相同类型对象的数量。
  • 初始化 ObjectOutputStream 需要(很小的 4 字节)开销。

关于协议的描述,请阅读this description

【讨论】:

  • 这就是我想这样做的方式,除非我能得到更好的答案,否则就是这样。谢谢。
【解决方案2】:

嗯,我从来没有听说过这样的工具。但我认为内存中的对象大小和序列化对象大小之间存在某种关系。所以你可以尝试使用分析器:VisualVM,它包含在 JDK 中或我最喜欢的 YourKit Profiler

【讨论】:

  • 有一些关系,但不是那么强的关系——类可以选择序列化一些成员,而丢弃其他成员。这可以完全改变画面......
  • 让我们来寻找其他答案。如果没有人知道这种工具并且您需要精确测量 - 您必须自己编写才能做到。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2011-01-21
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2013-03-22
相关资源
最近更新 更多