python的内存回收机制即gc模块讲解

最后容易造成内存问题的通常就是全局单例、全局缓存、长期存活的对象

引用计数(主要), 标记清除, 分代收集(辅助)

引用计数为0则会被gc回收。标记删除可以解决循环引用的问题。分代:0代--年轻代;1代--中年代;2代--老年代,存活越久被回收的频率越低。

通过gc机制基本解决内存回收的问题。

不要轻易实现对象的__del__方法,和循环引用一起使用容易造成内存泄露,无法回收

 

gc模块包括如下函数和属性:

gc.disable()关闭自动的垃圾回收,改为手动;

gc.get_count()查看0、1、2代的数量(创建的对象数量-销毁的对象数量)

gc.get_threshold()查看0、1、2代的阈值

gc.collect(*args, **kwargs)手动执行垃圾回收,参数可以为0、1、2,表示回收指定代的垃圾;没有参数,表示0、1、2代全部回收,返回不可达的对象数量,不可达的对象也是要被清楚的对象,会被标记清除

gc.set_debug(DEBUG_COLLECTABLE|DEBUG_LEAK|DEBUG_SAVEALL|DEBUG_STATS|DEBUG_UNCOLLECTABLE) 把所有的debug开关打开。估计后端的C语音是根据8个bit位来判断debug开关功能的。

 

sys.getrefcount(a)查看a的引用计数

 

 

直接查看源代码说明:

 

def is_tracked(*args, **kwargs): # real signature unknown
"""
Returns true if the object is tracked by the garbage collector.

Simple atomic objects will return false.
"""
pass
 

所以a=2没有被tracked,a=[2,2]被tracked

 

# encoding: utf-8
# module gc
# from (built-in)
# by generator 1.146
"""
This module provides access to the garbage collector for reference cycles.

enable() -- Enable automatic garbage collection.
disable() -- Disable automatic garbage collection.
isenabled() -- Returns true if automatic collection is enabled.
collect() -- Do a full collection right now.
get_count() -- Return the current collection counts.
get_stats() -- Return list of dictionaries containing per-generation stats.
set_debug() -- Set debugging flags.
get_debug() -- Get debugging flags.
set_threshold() -- Set the collection thresholds.
get_threshold() -- Return the current the collection thresholds.
get_objects() -- Return a list of all objects tracked by the collector.
is_tracked() -- Returns true if a given object is tracked.
get_referrers() -- Return the list of objects that refer to an object.
get_referents() -- Return the list of objects that an object refers to.
freeze() -- Freeze all tracked objects and ignore them for future collections.
unfreeze() -- Unfreeze all objects in the permanent generation.
get_freeze_count() -- Return the number of objects in the permanent generation.
"""
# no imports

# Variables with simple values

DEBUG_COLLECTABLE = 2
DEBUG_LEAK = 38
DEBUG_SAVEALL = 32
DEBUG_STATS = 1
DEBUG_UNCOLLECTABLE = 4

# functions

def collect(*args, **kwargs): # real signature unknown
    """
    Run the garbage collector.
    
    With no arguments, run a full collection.  The optional argument
    may be an integer specifying which generation to collect.  A ValueError
    is raised if the generation number is invalid.
    
    The number of unreachable objects is returned.
    """
    pass

def disable(*args, **kwargs): # real signature unknown
    """ Disable automatic garbage collection. """
    pass

def enable(*args, **kwargs): # real signature unknown
    """ Enable automatic garbage collection. """
    pass

def freeze(*args, **kwargs): # real signature unknown
    """
    Freeze all current tracked objects and ignore them for future collections.
    
    This can be used before a POSIX fork() call to make the gc copy-on-write friendly.
    Note: collection before a POSIX fork() call may free pages for future allocation
    which can cause copy-on-write.
    """
    pass

def get_count(*args, **kwargs): # real signature unknown
    """ Return a three-tuple of the current collection counts. """
    pass

def get_debug(*args, **kwargs): # real signature unknown
    """ Get the garbage collection debugging flags. """
    pass

def get_freeze_count(*args, **kwargs): # real signature unknown
    """ Return the number of objects in the permanent generation. """
    pass

def get_objects(*args, **kwargs): # real signature unknown
    """ Return a list of objects tracked by the collector (excluding the list returned). """
    pass

def get_referents(*objs): # real signature unknown; restored from __doc__
    """
    get_referents(*objs) -> list
    Return the list of objects that are directly referred to by objs.
    """
    return []

def get_referrers(*objs): # real signature unknown; restored from __doc__
    """
    get_referrers(*objs) -> list
    Return the list of objects that directly refer to any of objs.
    """
    return []

def get_stats(*args, **kwargs): # real signature unknown
    """ Return a list of dictionaries containing per-generation statistics. """
    pass

def get_threshold(*args, **kwargs): # real signature unknown
    """ Return the current collection thresholds. """
    pass

def isenabled(*args, **kwargs): # real signature unknown
    """ Returns true if automatic garbage collection is enabled. """
    pass

def is_tracked(*args, **kwargs): # real signature unknown
    """
    Returns true if the object is tracked by the garbage collector.
    
    Simple atomic objects will return false.
    """
    pass

def set_debug(*args, **kwargs): # real signature unknown
    """
    Set the garbage collection debugging flags.
    
      flags
        An integer that can have the following bits turned on:
          DEBUG_STATS - Print statistics during collection.
          DEBUG_COLLECTABLE - Print collectable objects found.
          DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects
            found.
          DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.
          DEBUG_LEAK - Debug leaking programs (everything but STATS).
    
    Debugging information is written to sys.stderr.
    """
    pass

def set_threshold(threshold0, threshold1=None, threshold2=None): # real signature unknown; restored from __doc__
    """
    set_threshold(threshold0, [threshold1, threshold2]) -> None
    
    Sets the collection thresholds.  Setting threshold0 to zero disables
    collection.
    """
    pass

def unfreeze(*args, **kwargs): # real signature unknown
    """
    Unfreeze all objects in the permanent generation.
    
    Put all objects in the permanent generation back into oldest generation.
    """
    pass

# classes

class __loader__(object):
    """
    Meta path import for built-in modules.
    
        All methods are either class or static methods to avoid the need to
        instantiate the class.
    """
    @classmethod
    def create_module(cls, *args, **kwargs): # real signature unknown
        """ Create a built-in module """
        pass

    @classmethod
    def exec_module(cls, *args, **kwargs): # real signature unknown
        """ Exec a built-in module """
        pass

    @classmethod
    def find_module(cls, *args, **kwargs): # real signature unknown
        """
        Find the built-in module.
        
                If 'path' is ever specified then the search is considered a failure.
        
                This method is deprecated.  Use find_spec() instead.
        """
        pass

    @classmethod
    def find_spec(cls, *args, **kwargs): # real signature unknown
        pass

    @classmethod
    def get_code(cls, *args, **kwargs): # real signature unknown
        """ Return None as built-in modules do not have code objects. """
        pass

    @classmethod
    def get_source(cls, *args, **kwargs): # real signature unknown
        """ Return None as built-in modules do not have source code. """
        pass

    @classmethod
    def is_package(cls, *args, **kwargs): # real signature unknown
        """ Return False as built-in modules are never packages. """
        pass

    @classmethod
    def load_module(cls, *args, **kwargs): # real signature unknown
        """
        Load the specified module into sys.modules and return it.
        
            This method is deprecated.  Use loader.exec_module instead.
        """
        pass

    def module_repr(module): # reliably restored by inspect
        """
        Return repr for the module.
        
                The method is deprecated.  The import machinery does the job itself.
        """
        pass

    def __init__(self, *args, **kwargs): # real signature unknown
        pass

    __weakref__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    """list of weak references to the object (if defined)"""


    __dict__ = None # (!) real value is ''


# variables with complex values

callbacks = []

garbage = []

__spec__ = None # (!) real value is ''

 

 

参考:

1、https://foofish.net/python-gc.html

2、

 

posted @ 2018-12-19 09:58  脚本小娃子  阅读(1808)  评论(0编辑  收藏  举报