• python3 内存管理


    
    
    怎么查找哪里存在内存泄露呢?武器就是两个库:gc、objgraph

    pip install psutil
    pip install objgraph
    pip install -U memory_profiler # https://github.com/fabianp/memory_profiler
    python -m memory_profiler example.py # 如果在函数前面用装饰器@profile(),则不用加-m memory_profiler参数
    print(gc.isenabled()) # 垃圾回收机制已打开
    info = psutil.virtual_memory()
    print('内存使用:', psutil.Process(os.getpid()).memory_info().rss)
    print('总内存:', info.total/(1024*1024*1024))
    print('内存占比:', info.percent)

    # 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动
    # 可以通过gc模块的get_threshold()方法,查看该阈值;也可以通过gc中的set_threshold()方法重新设置;也可以手动启动垃圾回收,即使用gc.collect()
    # Python将所有的对象分为0,1,2三代。
    # 所有的新建对象都是0代对象。
    # 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。
    # 垃圾回收启动时,一定会扫描所有的0代对象。
    # 如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。
    # 当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
    # get_threshold()返回的(700, 10, 10)返回的700是阈值,返回的两个10:每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收。

    def limit_memory(maxsize):
        try:
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    except ValueError as err:
    print(str(err)) # soft==-1 hard==-1 表示没有限制, 有值时单位是字节
    #print(soft/1024, hard)
    resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    print(soft, hard)
    if __name__ == '__main__':
    limit_memory(100) ret = list() try: for index in range(1, 1000000): ret.append(index) except Exception as err: print(str(err)) exit(-1)
  • 相关阅读:
    Forms Authentication Against An XML File
    ADO.NET 2.0 中的新增 DataSet 功能
    转一篇:是什么导致了业务人员和技术人员的矛盾?
    谁说雨中登泰山别有一番风味的????
    缓存用户控件输出的多个版本
    Creating Collection Classes in C#
    Why Create a DataSet, use a DataTable
    Adding Relationships to DataTables
    读取手机联系人和SIM卡联系人
    Android移动动画的参数
  • 原文地址:https://www.cnblogs.com/zxpo/p/10730462.html
Copyright © 2020-2023  润新知