我正在使用Java 1.6。
我面临一些内存堆问题,在堆转储中,我可以看到ObjectOutputStream
个对象消耗更多内存。
在我的某些地方的应用程序中,我使用了ObjectOutputStream
,但错过了在某些方法中关闭流。
那会影响性能吗?
流是否会保持打开状态并且会消耗堆内存吗?
当方法结束时使用ObjectOutputStream
但是流没有关闭时,Java会关闭流吗?
答案 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
。无论哪种方式,这样您都可以确保释放流资源。