是否有必要调用ObjectOutputStream #close()?

时间:2015-07-24 07:22:50

标签: java io heap-memory java-6 objectoutputstream

我正在使用Java 1.6。 我面临一些内存堆问题,在堆转储中,我可以看到ObjectOutputStream个对象消耗更多内存。

在我的某些地方的应用程序中,我使用了ObjectOutputStream,但错过了在某些方法中关闭流。 那会影响性能吗? 流是否会保持打开状态并且会消耗堆内存吗?

当方法结束时使用ObjectOutputStream但是流没有关闭时,Java会关闭流吗?

3 个答案:

答案 0 :(得分:4)

不,java不会自行关闭流。 将它打开会有多糟糕会影响你的性能取决于代码的其余部分。如果方法经常,那将是一个严重的问题。无论如何,关闭你的溪流只是更好的做法。

这是升级到java 7的一个很好的理由,你可以在其中编写

angular.module('myApp', [])
    .controller('myCtrl', ['$scope', '$filter', function ($scope, $filter) {
        $scope.allColumns = [{displayName: 'hello'}, {displayName: 'world'}];
        $scope.color = 'transparent';
}]);

无论如何发生这种情况,java都会在你完成它时为你关闭流。

当然,你可以在java 6中实现相同的行为,但它是more work

答案 1 :(得分:1)

在Java 1.6中,查看docs

  

靠近

     

public void close()              throws IOException关闭流。必须调用此方法以释放与该流关联的任何资源。

must非常强大,所以我会说是的,你must称之为。

我们可以查看source

public void close() throws IOException {
   flush();
   clear();
   bout.close();
}

确实清理了一些东西。它还实现了接口AutoCloseable,其中包含:

  

公共接口AutoCloseable

     

不再需要时必须关闭的资源。

因此,请调用close()方法。

注意:即使close()没有做任何事情,我仍然会在代码中给出一个明确的指示,即不再使用它,但这可能是个人偏好。

答案 2 :(得分:0)

Stef's great answer添加一些评论:

从另一个角度来看,您可能会问自己:在某些情况下,ObjectOutputStream开放的原因是什么? 如果您不再使用它,那么您应该尽快close 。遵循这个惯例是个好主意。

close方法确保没有对流的引用,因此可以对资源进行垃圾回收;使用它肯定是你想要做的事情,以拥有健康的记忆空间。

我通常做的是try {} finally {}没有catch {}

public static void closeStream(OutputStream out)
{
    if (out != null) out.close();
}

...

ObjectOutputStream out = null;

try
{
    //do something
}
finally
{
    closeStream(out);
}

如果需要,您当然可以使用catch阻止,或者在您的方法中添加throws。无论哪种方式,这样您都可以确保释放流资源。