线程与流

时间:2015-09-29 15:03:31

标签: java multithreading

假设我的程序中的一个线程从磁盘读取一个文件,它遇到一个错误(outOfMemory)并且线程被杀死而没有机会执行finally中给出的流的关闭。即使在该线程杀死之后它会保持该流开放吗?

2 个答案:

答案 0 :(得分:2)

finally块仍将被执行。但是,如果JVM内存不足,则关闭流会出现问题,导致finally块中出现另一个内存不足错误。如果发生这种情况,在JVM退出之前,流可能不会关闭。

答案 1 :(得分:2)

在大多数情况下,应该关闭它。但它主要取决于在流中隐藏关闭方法和引用保留时留下的内存。

尝试使用更多 内存时,会引发OOM,而不允许使用JVM。但这并不意味着你根本就没有记忆。引发OOM之后,由于许多原因,可以使用大量内存:该进程只是尝试分配一个不适合内存的BIG阵列,许多中间分配的对象可能因为引发异常而被丢弃,GC可能比通常的增量收集更深入的收集, 堆栈 内存可用于处理流关闭等。

然后,大多数流在收集垃圾时关闭。通常,您在方法范围内打开和关闭流,然后在退出时不再对其进行引用。因此,引用有资格进行垃圾回收并可能自动关闭(但是您必须等待GC收集它)。

大多数软件良好实践都基于"尽力而为"。不要试图思考/做太多。做出最好的努力"清理和let it crash。 在整个JVM消失的时候,你打算对非封闭流做什么?

在您的情况下("流处理"),"尽力而为"通过使用try-with-resources statement来完成。

如果您担心非封闭流的开销,您只需使用try-with-resources statement("尽力而为"应用程序)并且必须专注于参考保留,这是&#的真正原因34;内存泄漏"在Java中(因为大多数Stream在收集垃圾时都会关闭)。

关于"非封闭流的真正问题"是关于限制操作系统适用于"文件描述符/处理程序"的数量。一个过程在给定时间可以有。

线程不应该被杀死#34;如果是这样,你可能会很快遇到麻烦,因为monitor没有被释放(这将通过你的VM造成更多的伤害)。