Python如何查看内存泄漏

news2024/7/4 5:39:05

在python中,当一个变量不被引用的时候就会触发垃圾回收机制从而被从内存中删除,但有时一个不注意可能就会出现内存泄漏问题。

Python中可能的会出现内存泄露的情况

(1)  循环引用:当两个或多个对象相互引用,造成的循环引用进而导致内存泄露
(2)  大量创建对象:当程序中频繁创建大量的对象并没有及时销毁,也会导致内存泄露
(3)  全局变量:当全局变量被创建后一直存在,即使它们不再被使用,也会占用内存空间,可能导致内存泄露
(4)  不适当的缓存使用:如果在缓存中存储了大量数据,而没有适当地删除旧数据,会导致内存泄漏
(5)  C扩展模块:使用C扩展模块编写的代码可能会出现内存泄漏问题,因为C扩展代码不受Python的垃圾回收机制控制
(6)  超大型文件(上T)的读写操作
(7) 没有正确关闭文件或网络套接字:如果在使用完文件或网络套接字后不将其正确关闭,可能会导致内存泄漏

 那么我们如果发现了内存泄漏(内存占用一直在涨,直到最终程序报MemoryError),该如何去找到导致内存泄漏的代码呢?

1、安装memory-profiler

首先在cmd中

pip install memory-profiler -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

2、导入memory-profiler

在要查bug的代码py文件中,开头输入

from memory_profiler import profile

 在要测试的函数前加装饰器(注意是在函数前,也就是如果函数只被调用一次,生成的记录就只会有那一次的

@profile(precision=4,stream=open('log.txt','w+',encoding="utf-8"))

参数含义:

precision:精确到小数点后几位

stream:此模块分析结果保存到 'memory_profiler.log' 日志文件。如果没有此参数,分析结果会在控制台输出

3、运行我们的py文件

memory_profiler.log文件中即可显示每一行的内存情况。从而定位到底是哪一行开始发生了内存改变。

Linux:

python -m memory_profiler memory_profiler_test.py

windows:

直接运行py文件就行

log文件中是这样的:

 

Mem usage是当前行运行后的内存,Increment是当前行运行后增加的内存。

此时大致能知道是哪个操作增加了内存,后续却没有被释放掉(调别的函数发现内存没变回原来的)。找到这个有问题的变量。

4.只有当地址没有任何引用时,才会被释放,如何查看地址的引用情况

from sys import getrefcount
a = [1,2,3]
print(getrefcount(a))  #输出:2
b = a
print(getrefcount(b)) #输出:3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch学习:torch.argmax(input, dim, keepdim=False)详解

torch.argmax() 返回输入中所有元素的最大值的索引,与torch.max()中返回(values, indices)中的indices类似,它也常被用于深度学习中的分类问题。 在下面程序中,使用torch.argmax() import torcha torch.tensor([[1, 2, 3, 4],[4, 1, 2, 3]…

5个免费的3D钣金CAD软件

作为一名咨询顾问,我一直在寻找能够满足大客户需求的最佳 CAD 软件。 但我知道并不是每个人都在寻找劳斯莱斯式的钣金设计解决方案。 有时你只想要一些简单的东西,而且最好是免费的。 例如,如果你正在设计简单的折叠钣金零件,则只…

Linux安装filebeat

相关链接 主⻚: https://www.elastic.co/cn/products/beats/filebeat 下载: wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-linux-x86_64.tar.gz 百度云链接:https://pan.baidu.com/s/1MLshk_VyZZTmKhZvlS…

基于SpringBoot的一套强大后台管理系统

概述 一个功能强大而完善的后台管理系统框架,用户可基于此框架进行二次开发,定制成符合自己的需求的后台管理系统! 详细 运行截图: 项目结构: 详细说明: 环境说明: jdk1.8mavenMySQL5.7 项…

Vue框架--Vue过滤器

下面,我们一起来看看Vue中的过滤器。 过滤器: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。 语法: 1.注册过滤器:Vue.filter(name,callback) 或 ne…

分享一个springboot+uniapp开发的线上马拉松报名小程序源码 lw 调试

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

【史上最硬核分享】Docker+jenkinsPipeline 运行实现 python 自动化(超详细)

一、实现思路 在 Linux 服务器安装 docker创建 jenkins 容器jenkins 中创建 pipeline 项目根据自动化项目依赖包构建 python 镜像(构建自动化 python 环境)运行新的 python 容器,执行 jenkins 从仓库中拉下来的自动化项目执行完成之后删除容器 二、环境准备 Linu…

HUAWEI华为笔记本MateBook 14 I5 独显(KLV-W19)原装出厂Windows10系统1809

华为原厂Windows10系统,自带指纹、声卡、显卡等所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为电脑管家等预装程序 链接:https://pan.baidu.com/s/1ylRh1RmZU0S67ayGip8bpw?pwds34v 提取码:s34v

数据库被攻击需要注意什么

没想到自己用了一个简单的腾讯虚拟机,里面自己安装了一个 MySQL 数据库也会被黑客攻击。 一、问题现象 小程序访问不了,后台程序报数据库相关的错误。 查看数据库,发现数据库被篡改。 二、问题原因 1、为了可以远程能够访问数据库&#xf…

是时候重视官网了,寄生平台的生意表达,就是在给平台打工

B2C在国外80%在官网成交,20%在电商平台;在中国刚好反过来,99%在电商及社交平台,也许只有1%在官网,导致大量的利润都交给平台,换句话说,就是给平台打工。 “要改变普遍不重视官网的认知&#xf…

在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发环境

目录 在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发环境一 Fyne 和 MSYS2简介1.1 Fyne1.2 MSYS2 二 安装 MSYS22.1 下载MSYS22.2 安装2.3 环境变量设置2.4 检测安装环境 三 参考文档 在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发…

锐捷交换机vlan隔离(wifi段仅能访问外网,不能访问内网)

因为公司的wifi段,未做隔离,无意间上了网,发现能访问内网网段,这里内网是10、20段,管理网段是100段,于是做了和内网的vlan隔离。 拓朴如下,所有vlan的网关都起在核心上,所有交换机通…

SpringMVC----自定义注解

目录 自定义注解 是什么 作用 JDK元注解 测试案列 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 五.Aop自定义注解的应用 Mylog…

面试题三:请你谈一谈Vue中的filter功能的实现

Vue中过滤器(filter)的使用 我们想一下有methods为什么要有filter的存在呢,因为filter的实现效率比methods要高的多。 看一下官方定义: Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号…

常见知识蒸馏方法总结记录

蒸馏(Knowledge Distillation)是一种将一个模型(通常称为教师模型)学习到的知识迁移到另一个模型(通常称为学生模型)的技术。通常,教师模型是一个复杂而准确的模型,而学生模型则是一…

ABB PU515A 3BSE032401R1 自动化控制模块

ABB PU515A 3BSE032401R1 是一种自动化控制模块,通常用于工业自动化和控制系统中,以支持各种控制和监测任务。以下是可能适用于ABB PU515A 3BSE032401R1 自动化控制模块的一些常见产品特点: 多通道控制: PU515A 通常具有多个输入和…

基于5G网络的智能车间MES设计方案

导读 在数字化转型建设过程中,机械制造企业的难点是智能车间的设计。随着5G技术的发展,大量的带网络接口的智能设备的投入使用,智能车间的实施成为可能。本文从车间生产计划调度、过程管控、设备管理、质量管理、能耗管理和物流仓储等方面提…

【JAVA】关于重写(Override)与重载(Overload)

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言方法重载(Overload)重载的规则示例代码方法重写(Override)重写的规则示例代码方法重载与方法重写的区别 前言 关于JAVA&…

LabVIEW使用PID对激振器控制

LabVIEW使用PID对激振器控制 LabVIEW的PID在许多项目中都会用到,比如温度控制、压力控制、流量控制等,一般用自带的PID通过调节参数的值,基本上都可以解决。现在项目的情况是,通过正弦波的输出控制激振器,输出正弦波的…

【JUC系列-06】深入理解Semaphore底层原理和基本使用

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…