[pypy-commit] pypy default: Tweak to also report the single largest objects

arigo pypy.commits at gmail.com
Wed Jun 7 07:06:00 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r91558:7f9ffd5232c6
Date: 2017-06-07 13:05 +0200
http://bitbucket.org/pypy/pypy/changeset/7f9ffd5232c6/

Log:	Tweak to also report the single largest objects

diff --git a/pypy/tool/gcdump.py b/pypy/tool/gcdump.py
--- a/pypy/tool/gcdump.py
+++ b/pypy/tool/gcdump.py
@@ -13,10 +13,12 @@
 class Stat(object):
     summary = {}
     typeids = {0: '<GCROOT>'}
+    BIGOBJ = 65536   # bytes
 
     def summarize(self, filename):
         a = self.load_dump_file(filename)
         self.summary = {}     # {typenum: [count, totalsize]}
+        self.bigobjs = []     # list of individual (size, typenum)
         for obj in self.walk(a):
             self.add_object_summary(obj[2], obj[3])
 
@@ -50,6 +52,18 @@
             print '%8d %8.2fM  %s' % (stat[0], stat[1] / (1024.0*1024.0),
                                       self.get_type_name(typenum))
         print 'total %.1fM' % (totalsize / (1024.0*1024.0),)
+        print
+        lst = sorted(self.bigobjs)[-10:]
+        if lst:
+            if len(lst) == len(self.bigobjs):
+                print '%d objects take at least %d bytes each:' % (len(lst), self.BIGOBJ)
+            else:
+                print '%d largest single objects:' % (len(lst),)
+            for size, typenum in lst:
+                print '%8s %8.2fM  %s' % ('', size / (1024.0*1024.0),
+                                          self.get_type_name(typenum))
+        else:
+            print 'No object takes at least %d bytes on its own.' % (self.BIGOBJ,)
 
     def load_dump_file(self, filename):
         f = open(filename, 'rb')
@@ -62,6 +76,8 @@
         return a
 
     def add_object_summary(self, typenum, sizeobj):
+        if sizeobj >= self.BIGOBJ:
+            self.bigobjs.append((sizeobj, typenum))
         try:
             stat = self.summary[typenum]
         except KeyError:


More information about the pypy-commit mailing list