要增强集群中的消息传递,重要的是要在运行时了解消息的大小(我应该更喜欢本地处理还是远程处理)。
我只能找到有关基于 Java 检测估计对象内存大小的框架。我已经测试了 classmexer,它没有接近序列化大小和 sourceforge SizeOf。
在一个小型测试用例中,SizeOf 的错误率大约为 10%,而且比序列化快 10 倍。 (仍然 transient 完全打破了估计,因为例如 ArrayList 是 transient 的但被序列化为数组,修补 SizeOf 并不容易。但我可以接受)
另一方面,10% 错误率的 10 倍速度似乎不太好。我有什么想法可以做得更好吗?
更新:我还测试了 ObjectSize ( http://sourceforge.net/projects/objectsize-java )。结果似乎只适用于非继承对象:(
最佳答案
类在运行时占用的大小不一定与其在内存中的大小有任何关系。您提到的示例是 transient 字段。其他示例包括对象何时实现 Externalizable 并自行处理序列化。
如果一个对象实现了 Externalizable 或提供了 readObject()
/writeObject()
那么你最好的办法是将该对象序列化到一个内存缓冲区以找出大小。它不会很快,但会很准确。
如果对象使用默认序列化,那么您可以修改 SizeOf 以考虑 transient 字段。
在序列化许多相同类型的对象之后,您可以为该类型建立一个“序列化配置文件”,将序列化大小与来自 SizeOf 的运行时大小相关联。这将允许您快速估计序列化大小(使用 SizeOf),然后将其与运行时大小相关联,以获得比 SizeOf 提供的结果更准确的结果。
关于java - 如何在不实际序列化对象的情况下估计 Java 中对象的序列化大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3069018/