【问题标题】:how to isolate memory leaks/lost using sbcl如何使用 sbcl 隔离内存泄漏/丢失
【发布时间】:2012-12-08 19:07:56
【问题描述】:

我的应用程序将给定的数据转换为树表示,它使用了太多的内存。因为它设法在崩溃之前将大约 200-300MB 的内存变成大约 3GB。

我现在想弄清楚泄漏在哪里,是程序的哪个部分导致的。

因此,我现在想知道在 common-lisp 中使用 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

【问题讨论】:

    标签: common-lisp sbcl


    【解决方案1】:

    试试确定性分析器,它在 Slime 中通过slime-profile* commandsREPL 提供。它会为您进行包装,并且可以报告每个函数的 CPU 和内存使用情况,但会产生一些包装开销。

    SBCL 还附带一个统计分析器,该分析器的开销更少,如果需要分析长时间运行的流程并且关于问题区域的先验信息很少或不存在,则它会更有帮助。

    【讨论】:

    • 那些不会即时工作,并且是为了我的目的而冗长的方式。
    【解决方案2】:

    我编写了我自己的这样一个宏的版本,它很可能并不优雅,并且由于(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* ))))))
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2014-11-17
      • 2011-09-18
      相关资源
      最近更新 更多