转自:https://my.oschina.net/markco/blog/601773

利用meliae来监控python进程的内存占用情况

meliae是一个python进程内存占用监控、分析工具,它的安装需要依赖pyrex包。

一、安装:

安装python内存分析工具
sudo pip install cython
sudo pip install meliae

二、使用:

meliae会把某个时刻的内存给dump到一个文件中,然后再对该文件进行分析,当我们的某个python程序占用内存很大,可能有内存泄露发生时,可以使用该工具来进行检测分析。

scanner.dump_all_objects()

om = loader.load()
om.compute_parents()
om.collapse_instance_dicts()
print om.summarize()

1、在需要dump内存的地方,写上以下代码即可:

from meliae import scanner

scanner.dump_all_objects('/opt/log/dump.txt')

这样,我们就可以把当前的内存Objects都导出到了dump.txt。

2、然后再进行分析:

from meliae import loader

#加载dump文件

om = loader.load('/opt/log/dump.txt')

#计算各Objects的引用关系

om.compute_parents()

#去掉各对象Instance的_dict_属性

om.collapse_instance_dicts()

#分析内存占用情况

print om.summarize()

3、我的某个python程序分析结果如下:

Total 333015 objects, 188 types, Total size = 52.8MiB (55414199 bytes)

Index Count % Size % Cum Max Kind

0 10620 3 18096480 32 32 1704 POP3ClientProtocol

1 133004 39 6290033 11 44 31457 str

2 10628 3 5866656 10 54 552 Connector

3 10628 3 5866656 10 65 552 POP3ClientFactory

…….

从上面可以看到,共有333015个对象,占用了52M的内存

其中,共有10620个POP3ClientProtocol对象实例,占用了32%约18M的内存

最大的对象也只占用了1.7K的内存,但由于对象很多,所以最终它占用的内存就很大了

那么,我们就大概知道了内存泄露的地方,就是这个POP3ClientProtocol对象,在使用完成之后,没有释放造成的

我们还可以继续分析某个对象,找出它的引用关系

#得到所有的POP3ClientProtocol对象

p = om.get_all('POP3ClientProtocol')

#查看第一个对象

p[0]

说明该对象的地址为2803894924,占用了1.7K内存,引用了51个对象,它被1个对象所引用

>>>POP3ClientProtocol(2803894924 1704B 51refs
 1par)

#可以查看该对象的所有引用

p[0].c

>>>[str(3079323384 33B 10647par 'popuserid'), str(2814724096 45B 1par 'fuzimiao2000@sohu.com'), str(3079036128 31B 10624par 'mailnum'), int(165090672 12B 29par '75'),

#查看谁引用了这个对象

p[0].p

>>>[POP3ClientFactory(2803893100 552B 15refs 3par)]

聚合全网技术文章,根据你的阅读喜好进行个性推荐

下载 APP

©开源中国(OSChina.NET)
工信部

开源软件推进联盟

指定官方社区
深圳市奥思网络科技有限公司版权所有

粤ICP备12009483号-3

[转] python运行时内存分析工具meliae的更多相关文章

  1. JProfiler进行Java运行时内存分析

    原文地址:https://www.cnblogs.com/onmyway20xx/p/3963735.html 在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析 ...

  2. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...

  3. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  4. Eclipse MAT内存分析工具(Memory Analyzer Tool)

    MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...

  5. android--------Eclipse中ddms heap内存分析工具

    无 论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方. Android tools中的DDMS就带有一个很不错的内存监测工具Heap ...

  6. Windows系统内存分析工具的介绍

      Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...

  7. android--------Android内存分析工具的使用

    内存分析(in-memory analytics)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...

  8. 【Java线程与内存分析工具】VisualVM与MAT简明教程

    目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...

  9. Dotmemory 内存分析工具

    Dotmemory 内存分析工具 教程一.开始学习dotmemory 在本教程中,我们将学习如何运行dotMemory内存快照.此外,我们将简要地看看dotMemory的用户界面和基本分析的概念.考虑 ...

随机推荐

  1. mybatis mapper配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  2. gometalinter代码质量检查分析工具(golang)

    GitHub地址:https://github.com/alecthomas/gometalinter gometalinter安装和使用 1.安装 go get github.com/alectho ...

  3. 剑指Offer_编程题_18

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  4. Python 排序和numpy排序,得到排序后索引序列(及源list的序列)

    Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...

  5. Java工具之上传文件

    4个代码 1.前端JSP 2.自定义异常类 3.文件上传抽象类 4.Servlet 1.JSP <%@ page contentType="text/html;charset=UTF- ...

  6. JWT认证

    1.什么是JWT Token JWT(Json Web Tokens) 是一个开放标准(RFC 7519),它定义了一种简洁,自包含,JSON 对象形式的安全传递信息的方法.JWT常用在 Web 应用 ...

  7. Emacs 快速指南(中文翻译)

      Emacs 快速指南 目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RESP ...

  8. 指定so动态链接库连接器

    在学习x86_64汇编时, 发现一旦使用glibc库函数, 如printf时, 一般是需要使用为ld传递命令行参数-lc来动态连接libc.so的, 但是, 生成的可执行文件却无法运行: 气煞我也! ...

  9. Java通过cal.get(Calendar.MONTH)比真实月份少一个月

    Calendar cal = Calendar.getInstance();假如当前是12月,cal.get(cal.MONTH)是11月.

  10. CC2541设置中断输入模式

    //P0.0 /* SW_6 is at P0.1 */#define HAL_KEY_SW_6_PORT P0#define HAL_KEY_SW_6_BIT BV(0)#define HAL_KE ...