我在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表示它可以用于获取对象大小的实现特定近似值。"所以,它只会是近似的衡量标准。
这里有什么我想念的东西。我正在关闭文件和缓冲读取器。什么可以占用所有的记忆?出于公司政策原因,我无法分享代码 - 任何帮助或指示都将受到高度赞赏。感谢
答案 0 :(得分:0)
磁盘上的序列化大小与内存中的数据大小无关。 Java中的每个对象都有一些内存开销(可能因JVM模式和版本而异)。单个字节数组将被序列化和反序列化为大约相同的大小/内存。但是,数十亿个8字节数组不会。
如果在反序列化数据后创建数据的堆转储,则应该能够确定内存的确切位置。
How to collect heap dumps of any java process