所以我正在研究Ruby中的File
类。在我挖掘的过程中,我了解到File
是IO
的子类。根据我的理解,当您创建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')
,我只是以此为例
答案 0 :(得分:1)
除了sys*
系列操作之外,Ruby的IO操作最终会分配文件描述符和缓冲区。
如果你没有关闭IO
对象,那么你是正确的......你很可能同时泄漏fd和缓冲区。
现在,如果以覆盖或以其他方式结束旧引用的生命周期的方式分配它,那么Ruby可以g / c整个对象。这肯定会释放缓冲区,并最终释放FD。
然而,在所有语言中,依赖在ag / c触发的终结器上被认为是非常糟糕的做法,因为它不可预测需要多长时间以及在一个时间内存在多少未完成的OS级资源时间。在g / c机器启动之前,您可能会超出一些局部限制。
一般规则是同步分配和释放OS资源。
只要我击败受试者死亡,就会有例外。如果你正在分配固定数量的描述符或其他东西,并且它们都必须立即存在,并且程序将在完成其工作后退出,那么就可以离开它们。操作系统清理所有内容。例如,最好不要在退出前释放内存。如果程序即将退出,则完全浪费管理堆所需的处理。操作系统只是将程序的每一页放在其空闲列表中。并且例外有一个例外。如果是家庭作业,我会释放一切。