2012-12-08 21 views
1

我的應用程序,果然給定的數據爲樹表示,使用太多的內存。因爲它在崩潰之前將200-300MB內存轉換爲大約3GB。如何隔離內存泄漏/使用丟失SBCL

我現在想找出其中的泄漏,該計劃的一部分,該原因。

所以我現在確實很想知道在共口齒不清內存分析最常見,最有效的技術,使用SBCL是什麼?

我已經看了(room)(time),但其輸出的方式繁瑣,我需要的包裝物,會說:「執行後的總體內存使用情況是+ 1000Byte」,這會做這筆交易,我只是想知道內存在哪裏使用。另一個標準是,它的工作「對飛」的應用程序很可能會崩潰,由於沒有剩餘的RAM。

東西看起來像這樣:

(dotimes (i 4) 
    (profiler-wrapper :messg "After execution memory ~a~%" (execute-me i))) 

After execution memory +100Mb 
After execution memory +100Mb 
After execution memory +100Mb 
After execution memory +100Mb 
NIL 

回答

1

我寫我自己這樣一個宏觀的版本,它是最有可能不是優雅,它的代碼慢顯著由於(sb-ext:gc :full t)但它給的一些觀點執行給定主體後的內存使用情況。

(defparameter *last-profile-step* 0) 

(defmacro profile-it ((name gc-on) &body body) 
    `(let ((*last-profile-step* ,(if gc-on 
        `(progn 
        (sb-ext:gc :full t) 
        (sb-kernel::dynamic-usage)) 
        `(sb-kernel::dynamic-usage)))) 
     (unwind-protect 
     (progn 
      ,@body) 
    (progn 
     (FORMAT t "After execution of ~a : ~a byte~%" ,name 
      (- ,(if gc-on 
       `(progn 
        (sb-ext:gc :full t) 
        (sb-kernel::dynamic-usage)) 
       `(sb-kernel::dynamic-usage)) 
       *last-profile-step*)))))) 
2

嘗試確定性分析器,其可在煤泥通過slime-profile* commandsREPL。它爲你打包並且可以報告每個函數的CPU和內存使用情況,這是以包裝的一些開銷爲代價的。

SBCL還配備了具有較少的開銷,更有益的,如果長時間運行的進程需要加以分析和了解存在的地區問題很少或沒有先驗信息的統計分析工具。

+0

在飛行中那些無法正常工作,且方式爲verbose我的目的。 – Sim