内存问题-InputStream / OutputStream

时间:2019-05-08 13:22:49

标签: java

没什么特别的,只是令人沮丧。在此ObjectInputStream $ HandleTable $ HandleList []

上使用1.4GB内存

see picture for visualization

我使用ObjectInputStream和ObjectOutputStream将我的文件解析为二进制(.obj)文件。因此,这确实是有道理的。我或多或少只是想知道是否存在某种“ hack”来减少这种情况。也许。

尝试过input.close()和output.close(),但是由于我的书写和阅读都被try / catch {}包围,所以这两个方法调用是多余的。

XX

不希望将其减少到0个字节,但只是想听听是否有人可能有一个主意。

预先感谢

3 个答案:

答案 0 :(得分:2)

1)尝试立即读写输出,使对象符合GC +的条件,确保使用局部变量而不是字段,这样临时对象的生命周期不会延长到解析器的生命周期

2)try/catch {} those two method calls are redundant.尝试/捕获不会关闭资源,除非您使用try-with语法(例如try (input = new ObjectInputStream(...))

答案 1 :(得分:1)

HandleTable的内存消耗表明您没有正确关闭ObjectInputStreamObjectInputStream.close()将在内部清除HandleTable,这不是多余的,必须调用它来清除句柄。

使用try-with-resources或在close()中调用finally。在这里,您不应该依赖GC来完成工作。

答案 2 :(得分:1)

默认序列化的问题在于它需要注册其他报头(要序列化的类等)以及引用(如我所记得的,ObjectOutputStream确保实例A和B是否依赖于实例C ,那么在使用ObjectInputStream时它仍然是正确的;例如:不能有C取决于A,B取决于C')。这将需要一点空间。

  • 您可以使用DataInputStreamDataOutputStream代替ObjectOutputStream / ObjectInputStream召开大会,尽管您的文件格式将非常适合您的需要,并且对数据格式更改更加敏感。
  • 您还可以尝试实现Serializable hidden 方法writeObjectreadObject(请参阅链接)以自定义对象的序列化形式。
  • li>