码迷,mamicode.com
首页 > 编程语言 > 详细

python3 内存管理

时间:2019-04-18 17:06:09      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:参数   col   err   collect   返回   tps   profile   val   bsp   


怎么查找哪里存在内存泄露呢?武器就是两个库: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)

 

python3 内存管理

标签:参数   col   err   collect   返回   tps   profile   val   bsp   

原文地址:https://www.cnblogs.com/zxpo/p/10730462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!