2012-06-20 49 views
0

我想無限期運行的腳本。它看起來像我當前的腳本,如下所示,導致內存泄漏。另外,我想保留@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 
+0

我想你需要爲我們提供一些實際上重現泄漏的代碼。這就是說,相互遞歸聽起來不太好,至少最終會讓你擺脫堆棧空間。爲什麼不使用循環? – 2012-06-20 23:02:56

回答

2

永久遞歸不僅可以繼續消耗內存,但最終會因堆棧溢出而失敗。將您的無限期處理更改爲簡單循環。

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 
+0

我實在不明白這是怎麼從我在做什麼,不同的地方我的無限循環是一個簡單的來回兩種方法之間的事。 – chief

+0

好吧,我用一個簡單的永久遞歸運行了一個小腳本,並且堆棧立即溢出。 while循環永遠持續下去。感謝 – chief

+3

@chief當您遞歸但永遠不會返回時,您會在每次方法調用時添加堆棧幀。最終,您在堆棧中的空間不足以獲得新框架。循環時,不會增加堆棧。 – dbenhur