Java:反序列化时序列化java对象的大小和内存消耗的巨大差异

时间:2016-08-02 10:59:56

标签: java serialization memory-management deserialization trie

我在patricia trie(https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/trie/PatriciaTrie.html)的磁盘上有一个序列化对象。在磁盘上,它占用大约7.4 GB。我使用64 GB RAM服务器。反序列化时,相应进程的内存消耗上升到40 GB。这是明智的,因为Serialized object size vs in memory object size in Java的最高投票回答说"内存中的大小通常是可序列化大小的一半到两倍!"我原本期望内存大小不超过15 GB,但40 GB太多,因为其他进程也会被加载。

我曾考虑使用http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html来衡量内存中的大小,但Calculate size of Object in Java表示它可以用于获取对象大小的实现特定近似值。"所以,它只会是近似的衡量标准。

这里有什么我想念的东西。我正在关闭文件和缓冲读取器。什么可以占用所有的记忆?出于公司政策原因,我无法分享代码 - 任何帮助或指示都将受到高度赞赏。感谢

1 个答案:

答案 0 :(得分:0)

磁盘上的序列化大小与内存中的数据大小无关。 Java中的每个对象都有一些内存开销(可能因JVM模式和版本而异)。单个字节数组将被序列化和反序列化为大约相同的大小/内存。但是,数十亿个8字节数组不会。

如果在反序列化数据后创建数据的堆转储,则应该能够确定内存的确切位置。

How to collect heap dumps of any java process

What is the memory consumption of an object in Java?

Trick behind JVM's compressed Oops