没什么特别的,只是令人沮丧。在此ObjectInputStream $ HandleTable $ HandleList []
上使用1.4GB内存我使用ObjectInputStream和ObjectOutputStream将我的文件解析为二进制(.obj)文件。因此,这确实是有道理的。我或多或少只是想知道是否存在某种“ hack”来减少这种情况。也许。
尝试过input.close()和output.close(),但是由于我的书写和阅读都被try / catch {}包围,所以这两个方法调用是多余的。
XX
不希望将其减少到0个字节,但只是想听听是否有人可能有一个主意。
预先感谢
答案 0 :(得分:2)
1)尝试立即读写输出,使对象符合GC +的条件,确保使用局部变量而不是字段,这样临时对象的生命周期不会延长到解析器的生命周期
2)try/catch {} those two method calls are redundant.
尝试/捕获不会关闭资源,除非您使用try-with
语法(例如try (input = new ObjectInputStream(...))
)
答案 1 :(得分:1)
HandleTable
的内存消耗表明您没有正确关闭ObjectInputStream
。 ObjectInputStream.close()
将在内部清除HandleTable
,这不是多余的,必须调用它来清除句柄。
使用try-with-resources
或在close()
中调用finally
。在这里,您不应该依赖GC来完成工作。
答案 2 :(得分:1)
默认序列化的问题在于它需要注册其他报头(要序列化的类等)以及引用(如我所记得的,ObjectOutputStream
确保实例A和B是否依赖于实例C ,那么在使用ObjectInputStream
时它仍然是正确的;例如:不能有C取决于A,B取决于C')。这将需要一点空间。
DataInputStream
和DataOutputStream
代替ObjectOutputStream
/ ObjectInputStream
召开大会,尽管您的文件格式将非常适合您的需要,并且对数据格式更改更加敏感。Serializable
hidden 方法writeObject
和readObject
(请参阅链接)以自定义对象的序列化形式。