snipt

Ctrl+h for KB shortcuts
Notice: Snipt is moving away from free accounts on May 1st, 2014. Read more about the transition here.
#31043

Python

Simple Reference Leak Finder

import logging
import sys
import types

def get_refcounts():
    d = {}
    # collect all classes
    for m in sys.modules.values():
        for sym in dir(m):
            o = getattr (m, sym)
            if type(o) is types.ClassType:
                d[o] = sys.getrefcount (o)
    # sort by refcount
    pairs = map (lambda x: (x[1],x[0]), d.items())
    pairs.sort()
    pairs.reverse()
    return pairs

def print_top(num = 15):
    logging.debug('Top Mem Leaks')
    for n, c in get_refcounts()[:num]:
        logging.debug('%10d %s' % (n, c.__name__))
https://snipt.net/embed/8d4ca97d96f270f21ef45d129dcc7cf3/
https://snipt.net/raw/8d4ca97d96f270f21ef45d129dcc7cf3/
8d4ca97d96f270f21ef45d129dcc7cf3
python
Python
22
2014-04-24T14:04:52
True
False
/api/public/snipt/31043/
simple-reference-leak-finder
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#L-1"> 1</a> <a href="#L-2"> 2</a> <a href="#L-3"> 3</a> <a href="#L-4"> 4</a> <a href="#L-5"> 5</a> <a href="#L-6"> 6</a> <a href="#L-7"> 7</a> <a href="#L-8"> 8</a> <a href="#L-9"> 9</a> <a href="#L-10">10</a> <a href="#L-11">11</a> <a href="#L-12">12</a> <a href="#L-13">13</a> <a href="#L-14">14</a> <a href="#L-15">15</a> <a href="#L-16">16</a> <a href="#L-17">17</a> <a href="#L-18">18</a> <a href="#L-19">19</a> <a href="#L-20">20</a> <a href="#L-21">21</a> <a href="#L-22">22</a></pre></div></td><td class="code"><div class="highlight"><pre><span id="L-1"><a name="L-1"></a><span class="kn">import</span> <span class="nn">logging</span> </span><span id="L-2"><a name="L-2"></a><span class="kn">import</span> <span class="nn">sys</span> </span><span id="L-3"><a name="L-3"></a><span class="kn">import</span> <span class="nn">types</span> </span><span id="L-4"><a name="L-4"></a> </span><span id="L-5"><a name="L-5"></a><span class="k">def</span> <span class="nf">get_refcounts</span><span class="p">():</span> </span><span id="L-6"><a name="L-6"></a> <span class="n">d</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-7"><a name="L-7"></a> <span class="c"># collect all classes</span> </span><span id="L-8"><a name="L-8"></a> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> </span><span id="L-9"><a name="L-9"></a> <span class="k">for</span> <span class="n">sym</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">m</span><span class="p">):</span> </span><span id="L-10"><a name="L-10"></a> <span class="n">o</span> <span class="o">=</span> <span class="nb">getattr</span> <span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">sym</span><span class="p">)</span> </span><span id="L-11"><a name="L-11"></a> <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="ow">is</span> <span class="n">types</span><span class="o">.</span><span class="n">ClassType</span><span class="p">:</span> </span><span id="L-12"><a name="L-12"></a> <span class="n">d</span><span class="p">[</span><span class="n">o</span><span class="p">]</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">getrefcount</span> <span class="p">(</span><span class="n">o</span><span class="p">)</span> </span><span id="L-13"><a name="L-13"></a> <span class="c"># sort by refcount</span> </span><span id="L-14"><a name="L-14"></a> <span class="n">pairs</span> <span class="o">=</span> <span class="nb">map</span> <span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">d</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> </span><span id="L-15"><a name="L-15"></a> <span class="n">pairs</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> </span><span id="L-16"><a name="L-16"></a> <span class="n">pairs</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span> </span><span id="L-17"><a name="L-17"></a> <span class="k">return</span> <span class="n">pairs</span> </span><span id="L-18"><a name="L-18"></a> </span><span id="L-19"><a name="L-19"></a><span class="k">def</span> <span class="nf">print_top</span><span class="p">(</span><span class="n">num</span> <span class="o">=</span> <span class="mi">15</span><span class="p">):</span> </span><span id="L-20"><a name="L-20"></a> <span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Top Mem Leaks&#39;</span><span class="p">)</span> </span><span id="L-21"><a name="L-21"></a> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">get_refcounts</span><span class="p">()[:</span><span class="n">num</span><span class="p">]:</span> </span><span id="L-22"><a name="L-22"></a> <span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%10d</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">__name__</span><span class="p">))</span> </span></pre></div> </td></tr></table>
memoryleak, python