【问题标题】:Java - Is ByteArrayOutputStream safe without flush() and close()?Java - 没有flush()和close(),ByteArrayOutputStream安全吗?
【发布时间】:2014-04-19 01:02:57
【问题描述】:

那么,如果 ByteArrayOutputStream 没有正确刷新和关闭,它会导致内存溢出吗?我的意思是它们是否必须放入代码中,否则 Java 会对其进行垃圾收集?

【问题讨论】:

标签: java


【解决方案1】:

不,一旦对它的最后一个引用丢失,它将被垃圾收集。

根据javadoc

关闭 ByteArrayOutputStream 无效。本文中的方法 类可以在流关闭后调用 生成一个 IOException。

另外,如果您查看代码,flushcloseByteArrayOutputStream 类中都是空操作(虽然 flush 是从 OutputStream 继承的,但在 @ 中是空操作987654327@ 除非在具体实现中被覆盖)。

【讨论】:

  • 谢谢。我只是想得到确认。由于我的代码严重依赖 ByteArrayOutputStream,所以恐怕没有正确地使用 flush() 或 close() 会导致后续阶段的内存溢出。
  • 另外,正如@tjg184 所说,养成在 finally 块中关闭流的习惯是个好主意。
【解决方案2】:

是的。不flush() 或不close()ByteArrayOutputStream 是安全的。无论您是否这样做,对内存使用量都没有影响。

close()flush()1ByteArrayOuputStream 执行任何操作的唯一情况是,如果您在包含缓冲组件的输出管道的末尾使用了它;例如BufferedWriter。然后你确实需要从管道的“顶部”刷新或关闭......以确保所有数据都进入字节数组。

调用flush()close() 没有GC 影响。无论哪种方式,只要对象仍然可访问,流的内容就会继续保存在内存中。 (相比之下,对外部资源的读/写流需要及时关闭,因为它们有一个需要释放的外部“资源描述符”......)

总结:

  • 它对flush()close() 无害ByteArrayOutputStream。这是不必要的。
  • 通常有必要关闭以ByteArrayOutputStream 结尾的输出管道,但这不是因为内存使用或 GC 考虑。
  • 只要可以访问ByteArrayOutputStream 对象,就会(至少)使用内存。

1 - 事实上,对于一些缓冲流,flush() 是不够的。例如,当管道中的一个组件使用块加密算法执行加密时,需要close() 导致最后一个部分块被填充、加密和写出。

【讨论】:

    【解决方案3】:

    如果查看 ByteArrayOutputStream 的源代码,您会发现 closeflush 方法是一个 noop,这意味着它们实际上什么都不做。但是,我仍然建议调用这些,因为尽管 Javadoc 中明确说明了 close 方法的行为,但实现可能会发生变化。

    其次,垃圾收集与这两种方法都没有关系。有几种不同的实现(引用计数是一种),但一般来说,当您的对象实例不再引用时,它将被垃圾回收。

    【讨论】:

    • 实现不可能改变,因为它的 close() 方法的行为是在 Javadoc 中指定的。
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多