代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

GC未清理(was:tempfile未自动删除,ruby)

  •  3
  • Dan Rosenstark  · 技术社区  · 15 年前

    Ruby tempfile实例在释放引用时自动删除相应的文件。但是,我有一台机器,情况并非如此。代码是

    irb> require 'tempfile'
    => true
    irb> t = Tempfile.new('test32')
    => #<File:/tmp/test32.27778.0>
    irb> exit
    

    在我的所有测试机器上,这会导致test32被删除,除了一个。我试图删除一个文件,使用 File.delete 不幸的是,这很管用。有我不见的红宝石配置吗?

    红宝石版

    ruby 1.8.6 (2009-06-08 patchlevel 369) [i686-linux].
    

    编辑: 在与DigitalRoss的对话中发现了一些额外的信息:如果我显式地释放tempfile引用(t=nil),那么tempfile就会被清除。 GC是否有可能以某种方式被修补或更改以需要它?

    这是一些在“好”机器上工作的代码,但在“坏”机器上却失败了

    include ObjectSpace
    t = "blah"
    define_finalizer(t, proc {|id| print "yes finalized id=#{id}", "\n" })
    

    在坏机器上,只有当我显式地将t设置为nil时,“yes finished”才会打印。

    2 回复  |  直到 14 年前
        1
  •  2
  •   DigitalRoss    15 年前

    好的,继续问题的评论线索…

    鲁比,或者说真的, Tempfile ,使用垃圾收集器管理终结器。(我假设它是这样工作的,而不是通过kernel::at_exit在运行很长的ruby中删除文件。)无论如何,在一个系统上,gc似乎有些不同。我们试着把它固定住。尝试这样做,看看清除对tempfile实例的唯一引用并启动gc是否会删除该文件。

    ross@deb:~$ irb
    >> require 'tempfile'
    => true
    >> $DEBUG=true
    => true
    >> t=Tempfile.new('aaa')
    => #<File:/tmp/aaa20090905-21437-1d460as-0>
    >> GC.start
    => nil
    >> t=nil
    => nil
    >> GC.start
    removing /tmp/aaa20090905-21437-1d460as-0...done
    => nil
    >> exit
    ross@deb:~$ 
    
        2
  •  1
  •   Winky    14 年前

    在1.8.7中,终结器和垃圾收集器有一个问题,从1.8.6中的描述中可能会遇到相同的问题。

    我们设法通过猴子修补tempfile来解决Rails应用程序中的问题。可能也适合你。代码: http://github.com/jwinky/ruby_tempfile_ioerror