zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    LinuxDay10——文本处理工具sed
    设计模式原则----开放封闭原则
    模式设计原则----单一职责原则
    策略模式
    建模工具
    vs查看源码行数
    单例模式(Singleton Pattern)
    UML
    简单工厂模式(Simple Factory Pattern)
    winform ProgressBar
  • 原文地址:https://www.cnblogs.com/zxpo/p/10730462.html
Copyright © 2011-2022 走看看