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

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

引用计数为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-
# 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 =
DEBUG_LEAK =
DEBUG_SAVEALL =
DEBUG_STATS =
DEBUG_UNCOLLECTABLE = # 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、

python的内存回收机制即gc模块讲解的更多相关文章

  1. 【Python】 垃圾回收机制和gc模块

    垃圾回收机制和gc模块 Py的一个大好处,就是灵活的变量声明和动态变量类型.虽然这使得学习py起来非常方便快捷,但是同时也带来了py在性能上的一些不足.其中相关内存比较主要的一点就是py不会对已经销毁 ...

  2. python的内存回收机制

          变量相当于门牌号,当门牌没有了,即函数的引用都没有调用了,内存的数据就会被清除掉. python内有个定时器,定期的会刷新,如果发现内存中数据被引用了,就会被回收,这个就是内存的回收机制 ...

  3. Python垃圾回收机制及gc模块详解:内存泄露的例子

    标记清理是用来解决循环引用的.分代回收针对所有的新创建即进入0代的对象和进入1.2代的对象..这样就解释了python“引用计数为主.标记清理+分代回收为辅”的垃圾回收原理,因为循环引用毕竟是少数情况 ...

  4. Python之美[从菜鸟到高手]--Python垃圾回收机制及gc模块详解

    http://blog.csdn.net/yueguanghaidao/article/details/11274737

  5. python 的内存回收,及深浅Copy详解

    一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...

  6. 详解python的垃圾回收机制

    python的垃圾回收机制 一.引子 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式 ...

  7. python中垃圾回收机制

    Python垃圾回收机制详解   一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...

  8. python的垃圾回收机制和析构函数__del__

    析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...

  9. python之垃圾回收机制

    一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...

随机推荐

  1. Linux 下开发环境的搭建(软件安装)

    一.Centos6.5下安装JDK 步骤1: 查看现有安装的JDK版本 rpm –qa | grep -i java 步骤2: 卸载已有软件 rpm -e --nodeps java-1.7.0-op ...

  2. centos7+python3.6+nginx+uwsgi+django2的搭建笔记

    公司需上线一套python编写的代码,需要给搭建一套环境  ,本次采用centos7+python3.6+nginx+uwsgi2+django2+mysql5.7的方式来进行搭建 写在部署前 在线上 ...

  3. ref:详解MYSQL数据库密码的加密方式及破解方法

    ref:https://blog.csdn.net/paul123456789io/article/details/53081921 MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中 ...

  4. 【原创】MySQL Replay线上流量压测工具

    一. 背景 去年做过一次mysql trace 重放的测试,由于performance schema本身采集样本的长度等限制,实际回放的成功率比较低. 最近找到一款开源的工具,基于TCPCopy实现了 ...

  5. WebApi入门

    饮水思源 http://www.cnblogs.com/guyun/p/4589115.html http://www.cnblogs.com/chutianshu1981/p/3288796.htm ...

  6. [leetcode trie]211. Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  7. 【枚举】【二分】Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) D. Resource Distribution

    题意:有两个服务要求被满足,服务S1要求x1数量的资源,S2要求x2数量的资源.有n个服务器来提供资源,第i台能提供a[i]的资源.当你选择一定数量的服务器来为某个服务提供资源后,资源需求会等量地分担 ...

  8. SpringBoot静态资源目录

    在web开发中,静态资源的访问是必不可少的,如:图片.js.css 等资源的访问. SpringBoot对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求. 在传统的web项目中静态资源 ...

  9. 【POJ】1840:Eqs【哈希表】

    Eqs Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 18299   Accepted: 8933 Description ...

  10. bzoj 1492

    这道题真好... 首先,感觉像DP,但是如果按照原题意,有无数个状态,每个状态又有无数个转移. 然后思考,我们每次买一部分和卖一部分的原因是什么,如果没有那个比例(就是rate=1恒成立),那么很容易 ...