Last active
January 26, 2017 21:49
-
-
Save homm/c20a7dc74f78d393f6ffac537532fd93 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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