【问题标题】:Continuously running a program, memory leak连续运行一个程序,内存泄漏
【发布时间】:2012-06-20 22:56:59
【问题描述】:

我想无限期地运行一个脚本。如下所示,看起来我当前的脚本会导致内存泄漏。此外,我想保留 @time_value 数组,因为我需要循环遍历每次新运行的值。

  class Data

    def initialize
      first_method
      @time_value = [30, 60, 90]
    end

    def first_method

      # get some data; takes about 1 hour
      second_method
    end

    def second_method
      #process the data
      first_method
    end
  end

  d = Data.new

【问题讨论】:

  • 我认为您需要向我们提供一些实际重现泄漏的代码。也就是说,相互递归听起来是个坏主意,至少最终会让你耗尽堆栈空间。为什么不直接使用循环?

标签: ruby memory-leaks


【解决方案1】:

永久递归可能不仅会继续消耗内存,而且最终会因堆栈溢出而失败。将您的无限期处理更改为一个简单的循环。

class Data
  def initialize
    @time_value = [30, 60, 90]
  end

  def run_forever
    while true
      first_method
      second_method
    end
  end

  def first_method
    # get some data; takes about 1 hour
  end

  def second_method
    #process the data
  end
end

Data.new.run_forever

【讨论】:

  • 我真的不明白这与我正在做的事情有何不同,我的无限循环只是在两种方法之间来回切换。
  • 好吧,我用简单的永久递归运行了一个小脚本,堆栈立即溢出。 while 循环永远持续下去。谢谢
  • @chief 当您递归但从不返回时,您会在每个方法调用中添加堆栈帧。最终,您在堆栈上用完了新框架的空间。循环时,没有堆栈增长。
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2014-07-03
  • 2018-04-21
  • 2020-01-15
  • 1970-01-01
  • 2018-10-09
  • 2021-04-17
相关资源
最近更新 更多