一、内存泄漏

像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题。

对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了“内存泄露”。

1、内存泄露的原因

对于 python 这种支持垃圾回收的语言来说,怎么还会有内存泄露? 概括来说,有以下三种原因:

所用到的用 C 语言开发的底层模块中出现了内存泄露。

代码中用到了全局的 list、 dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收

代码中有“引用循环”,并且被循环引用的对象定义了__del__方法,就会发生内存泄露。

为什么循环引用的对象定义了__del__方法后collect就不起作用了呢?

gc模块最常使用的方法就是gc.collect()方法,使用collect方法对循环引用的对象进行垃圾回收。

如果我们在类中重载了__del__方法。__del__方法定义了在用del语句删除对象时除了释放内存空间以外的操作。

一般而言,在使用了del语句的时候解释器首先会看要删除对象的引用计数,如果为0,那么就释放内存并执行del方法。

在这里,首先del语句出现时本身引用计数就不为0(因为有循环引用的存在),所以解释器不释放内存;

再者,执行collect方法时应该会清除循环引用所产生的无效引用计数从而达到del的目的,对于这两个循环引用对象而言,

python无法判断调用它们的del方法时会不会要用到对方那个对象,比如在进行b.del()时可能会用到b._a也就是a,如果在那之前a已经被释放,那么就彻底GG了。

为了避免这种情况,collect方法默认不对重载了del方法的循环引用对象进行回收,而它们俩的状态也会从unreachable转变为uncollectable。由于是uncollectable的,自然就不会被collect处理,所以就进入了garbage列表。

2、内存泄露的诊断思路

无论是哪种方式的内存泄露,最终表现的形式都是某些 python 对象在不停的增长;因此,首先是要找到这些异常的对象。

3、诊断步骤

用到的工具: gc 模块和 objgraph 模块

gc模块 是Python的垃圾收集器模块,gc使用标记清除算法回收垃圾

objgraph 是一个用于诊断内存问题的工具

1、 在服务程序的循环逻辑中,选择出一个诊断点

2、 在诊断点,插入如下诊断语句

import gc

import objgraph

### 强制进行垃圾回收

gc.collect()

### 打印出对象数目最多的 50 个类型信息

objgraph.show_most_common_types(limit=50)

4、检查统计信息,找到异常对象

运行加入诊断语句的服务程序,并将打印到屏幕上的统计信息重定向到日志中。运行一段时间后,就可以来分析日志,看看哪些对象在不停的增长。

比如,排查结果可能是:

一个多线程程序,多个线程作为生产者,一个线程作为消费者,通过将一个 tuple 对象送入异步队列进行通信。

由于消费者的处理速度跟不上生产者的速度,又没有进行同步, 导致异步队列中的对象越来越多。

二、内存溢出

1、内存溢出原因

内存中加载的数据量过于庞大,如一次从数据库取出过多数据

集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收

代码中存在死循环或循环产生过多重复的对象实体

使用的第三方软件中的BUG

启动参数内存值设定的过小

2、内存溢出的解决方案

第一步,修改JVM启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置

重点排查以下几点:

检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

检查代码中是否有死循环或递归调用。

检查是否有大循环重复产生新对象实体。

检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况

三、内存泄漏和内存溢出的区别

内存溢出是指向JVM申请内存空间时没有足够的可用内存了,就会抛出OOM即内存溢出。

内存泄漏是指,向JVM申请了一块内存空间,使用完后没有释放,由于没有释放,这块内存区域其他类加载的时候无法申请,

同时当前类又没有这块内存空间的内存地址了也无法使用,相当于丢了一块内存,这就是内存泄漏。

值得注意的是内存泄漏最终会导致内存溢出,很好理解,内存丢了很多最后当然内存不够用了。

以上就是Python内存泄漏和内存溢出的解决方案的详细内容,更多关于Python内存泄漏和内存溢出的资料请关注WEB开发者其它相关文章!

python多线程内存溢出_Python内存泄漏和内存溢出的解决方案相关推荐

  1. python多线程的作用_Python多线程中三个函数的强大功能简介

    在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...

  2. python多线程结束线程_Python线程– Python多线程

    python多线程结束线程 Python threading module is used to implement multithreading in python programs. In thi ...

  3. python多线程数据交互_python 多线程 通信

    一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...

  4. python多线程有用吗_Python多线程理解

    前言 在写python爬虫的时候遇到了多线程,使用多线程的目的是降低抓取时间.接着我接触了一些IO概念,IO就是Input和Ouput,数据进出CPU的意思. 数据从网线或网卡进入CPU算Input( ...

  5. python多线程详解_Python多线程详解

    前言 由于最近的工作中一直需要用到Python去处理数据,而在面对大量的数据时,Python多线程的优势就展现出来了.因而借此机会,尽可能详尽地来阐述Python多线程.但对于其更底层的实现机制,在此 ...

  6. python多线程守护线程_Python守护程序线程

    python多线程守护线程 In this tutorial we will be learning about Python Daemon Thread. In our previous tutor ...

  7. python 多线程读写文件_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  8. python多线程结束线程_Python多线程和Office第2部分

    python多线程结束线程 This is the second and final part of the series. You can find the first part of the bl ...

  9. python 多线程读写文件_python多线程同步之文件读写控制

    本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env pyth ...

  10. python 多线程 廖雪峰_Python 一篇学会多线程

    多线程和多进程是什么自行google补脑,廖雪峰官网也有,但是不够简洁,有点晕,所以就整个简单的范例. 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用 ...

最新文章

  1. python基础之python中if __name__ == '__main__': 的解析
  2. QT计算器功能的实现
  3. PHP提取中文首字母
  4. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波15 - 锐化高通滤波器 -拉普拉斯核(二阶导数)
  5. 我的技术回顾2019不止技术的一年
  6. P4707-重返现世【dp,数学期望,扩展min-max容斥】
  7. zk中的Datebox中得到Timestamp
  8. 使用ThreadLocal绑定连接资源(事务)
  9. 榴莲肉多到流出来!引爆全国吃货的榴莲千层终于杀到来!100%好评
  10. 使用 Swagger 2 构建 RESTful APIs
  11. 提高语音识别率:必须加入深度学习吗?
  12. 广告传媒实际税负怎么计算_传媒宣传业增值税税负多少
  13. visio一分二的箭头_Microsoft Office Visio绘画双箭头直线的具体步骤介绍
  14. eigen一维向量_Eigen中的矩阵及向量运算
  15. 洛谷 P1359 租用游艇(简单dp/Dijkstra)
  16. 智能手机与pc计算机的区别,手机cpu和电脑cpu有什么区别
  17. 某国企 测试工程师 面试记录 2021-11-04
  18. 三相永磁同步电机PMSM仿真 simulink仿真 永磁同步电机仿真,PI调节器
  19. CentOS7转发非3306端口到3306端口
  20. SpringBoot2.2.2+Elasticsearch7.6.2实现中文、拼音、拼音首字母智能提示功能

热门文章

  1. 50%的企业都会遭受邮箱攻击
  2. 贝叶斯算法对PDF文档归类
  3. 以数为基,恒生电子赋能量化交易数智升级
  4. 存款到余额宝的人多吗?为什么?
  5. 基于I-MX287A的mqtt远程控制ARM板上LED灯小项目总结
  6. JAVA_23种设计模式
  7. Coursera 吴恩达 DeepLearning Sequence model 第二周作业 Emojify - v2(多分类问题,有彩蛋,性能超过预期)
  8. WPF 文本框只能输入数字
  9. 体验在windows7系统中玩红警!!!
  10. 情感伤感语录标题文案