使用Ruby“File”类而不关闭泄漏内存吗?

时间:2012-11-13 02:52:46

标签: ruby io

所以我正在研究Ruby中的File类。在我挖掘的过程中,我了解到FileIO的子类。根据我的理解,当您创建IO对象(或File对象)时,将打开一个缓冲区,该缓冲区允许您读取和写入该文件。我不完全理解缓冲区是什么,但显然它会在对象上调用#close方法之前保持打开状态。根据我的理解,无论您拨打File.new还是File.open,都会打开此缓冲区(如果我错了,请纠正我。)

所以说你喜欢用File类来表示路径和类似的东西:

f = File.new('spec/tmp/testfile.md')
File.basename(f)

但你永远不会打电话给f.close。离开此缓冲区是否打开泄漏内存?如果我在文件系统中为一棵树调用了几百次,我会遇到什么问题?

感谢您的回复!

PS 我知道您只能使用File.basename('spec/tmp/testfile.md'),我只是以此为例

1 个答案:

答案 0 :(得分:1)

除了sys*系列操作之外,Ruby的IO操作最终会分配文件描述符和缓冲区。

如果你没有关闭IO对象,那么你是正确的......你很可能同时泄漏fd和缓冲区。

现在,如果以覆盖或以其他方式结束旧引用的生命周期的方式分配它,那么Ruby可以g / c整个对象。这肯定会释放缓冲区,并最终释放FD。

然而,在所有语言中,依赖在ag / c触发的终结器上被认为是非常糟糕的做法,因为它不可预测需要多长时间以及在一个时间内存在多少未完成的OS级资源时间。在g / c机器启动之前,您可能会超出一些局部限制。

一般规则是同步分配和释放OS资源。


只要我击败受试者死亡,就会有例外。如果你正在分配固定数量的描述符或其他东西,并且它们都必须立即存在,并且程序将在完成其工作后退出,那么就可以离开它们。操作系统清理所有内容。例如,最好不要在退出前释放内存。如果程序即将退出,则完全浪费管理堆所需的处理。操作系统只是将程序的每一页放在其空闲列表中。并且例外有一个例外。如果是家庭作业,我会释放一切。