Skip to content

Instantly share code, notes, and snippets.

@homm
Last active January 26, 2017 21:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save homm/c20a7dc74f78d393f6ffac537532fd93 to your computer and use it in GitHub Desktop.
Save homm/c20a7dc74f78d393f6ffac537532fd93 to your computer and use it in GitHub Desktop.
from __future__ import print_function
import gc
import traceback
import types
from tornado import web, ioloop, gen
from tornado.http1connection import HTTP1ServerConnection
def find_circular_references(garbage=None):
def inner(level):
for item in level:
item_id = id(item)
if item_id not in garbage_ids:
continue
if item_id in visited_ids:
continue
if item_id in stack_ids:
candidate = stack[stack.index(item):]
candidate.append(item)
found.append(candidate)
continue
stack.append(item)
stack_ids.add(item_id)
inner(gc.get_referents(item))
stack.pop()
stack_ids.remove(item_id)
visited_ids.add(item_id)
garbage = garbage or gc.garbage
found = []
stack = []
stack_ids = set()
garbage_ids = set(map(id, garbage))
visited_ids = set()
inner(garbage)
inner = None
return found
class CollectHandler(web.RequestHandler):
@gen.coroutine
def get(self):
self.write("Collected: {}\n".format(gc.collect()))
self.write("Garbage: {}\n".format(len(gc.garbage)))
for circular in find_circular_references():
print('\n==========\n Circular \n==========')
for item in circular:
print(' ', repr(item))
for item in circular:
if isinstance(item, types.FrameType):
print('\nLocals:', item.f_locals)
print('\nTraceback:', repr(item))
traceback.print_stack(item)
class DummyHandler(web.RequestHandler):
@gen.coroutine
def get(self):
self.write('ok\n')
application = web.Application([
(r'/dummy/', DummyHandler),
(r'/collect/', CollectHandler),
], debug=True)
if __name__ == "__main__":
gc.disable()
gc.collect()
gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)
print('GC disabled')
print("Start on 8888")
application.listen(8888)
ioloop.IOLoop.current().start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment