在stackoverflow上查询了一下这个错误的原因, 高赞回答的解释如下:
Exit code 137 means that your process was killed by (signal 9) SIGKILL . In the case you manually stopped it - there’s your answer.
If you didn’t manually stop the script and still got this error code, then the script was killed by your OS. In most of the cases, it is caused by excessive memory usage.
这看起来是Python内存溢出导致的问题,于是我从定时任务实例对应的系统监控图查看了一下内存占用的情况,如下:
图中果然可以看到有内存打满的情况,因此这的确是一个典型的OOM问题。于是我对这个问题往解决OOM的方向进一步分析。
以之前Java OOM的排查经验,解决这种问题一般需要dump内存快照,分析内存分配,对象引用链和GC状态等等。因此我猜测Python的OOM排查应该也是类似的。
工欲善其事,必先利其器。我先对Python的内存回收机制以及常用的Python内存分析工具进行了调研,调研的结果如下:
objgraph: 可以打印类型对象的数目, 绘制有关objs的引用图
link
tracemalloc: Python3内置库,非常轻量和强大,可以用于追踪内存的使用情况,查看对象
一. 问题现象最近我在做一个推荐系统中的离线计算时,遇到了离线定时任务总是挂掉的问题,日志中记录的错误异常如下:python exited with code 137在stackoverflow上查询了一下这个错误的原因, 高赞回答的解释如下:Exit code 137 means that your process was killed by (signal 9) SIGKILL . In the case you manually stopped it - there’s your answ
上个星期,把之前弄的tensorflow项目部署到线上,真正开始进行评测的时候,发现了还是会有一些
问题
,而且这些
问题
还是相对比较严重的,在这里我就先给大家分享一下model_from_json造成的
内存泄露
问题
,以及怎么解决的。
在我的一篇博客中,写了关于tensorflow训练完后model的保存以及借助redis加载到内存形成分并发调用,并且在对模型进行更新的时候只需要更新一台机器即可,有加快模型调用以及方便的作用。
感兴趣的可以先去看看我的这篇博客。
https://editor.csdn.
一、
内存泄漏
像Java程序一样,虽然
Python
本身也有垃圾回收的功能,但是同样也会产生
内存泄漏
的
问题
。
对于一个用
python
实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了“
内存泄露
”。
1、
内存泄露
的原因
对于
python
这种支持垃圾回收的语言来说,怎么还会有
内存泄露
? 概括来说,有以下三种原因:
所用到的用 C 语言开发的底层模块中出现了
内存泄露
。
代码中用到了全局的 list、 dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收
代码中有“引用循环”,并且被循环引用的对象定义了__del__方法,就会发生内存
最近工作中慢慢开始用
python
协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多
问题
,这里整理了一次
内存泄漏
的
问题
通常我们写
python
程序的时候也很少关注内存这个
问题
(当然可能我的能力还有待提升),可能写c和c++的朋友会更多的考虑这个
问题
,但是一旦我们的
python
程序出现了
内存泄漏
的
问题
,也将是一件非常麻烦的事情了,而最近的一次代码中也碰到了这个
问题
,不过好在最后内存溢出不是我代码的
问题
,而是所用到的一个包出现了内存的
问题
,下面我通过一个简单的代码模拟出内存的
问题
,然后也会将解决的过程描述一下,希望能帮助到遇到
不要以为
Python
有自动垃圾回收就不会
内存泄漏
,本着它有“垃圾回收”我有“垃圾代码”的精神,现在总结一下三种常见的
内存泄漏
场景。
无穷大导致
内存泄漏
如果把
内存泄漏
定义成只申请不释放,那么借着
Python
中整数可以无穷大的这个特点,我们一行代码就可以完成
内存泄漏
了。
i = 1024 ** 1024 ** 1024
循环引用导致
内存泄漏
引用记数器 是
Python
垃圾回收机制的基础,如果一个对象的引用数量不为 0 那么是不会被垃圾回收的,我们可以通过 sys.getrefcount 来得到给定对象的引用数量。
In [1]: import sys
python
在正常使用情况下,不会出现
内存泄漏
。但是遇到request、opencv模块时就经常被爆出
内存泄漏
。本文主要讲述requests下出现
内存泄漏
解决办法(PS:opencv这种模块还没有使用过)。
一、
python
内存泄漏
原因
讲
内存泄漏
原因不如了解一下
python
内存管理机制就明白了。网上搜索大概如下:
1,引用计数
2,垃圾回收
3,内存池
例如一个以下
定义:
内存泄露
是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。
内存泄漏
并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。
解决方法:
有 del() 函数的对象间的循环引用是导致
内存泄漏
的主凶。不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存...
一、
python
有自动垃圾回收机制(当对象的引用计数为零时解释器会自动释放内存),出现
内存泄露
的场景一般是扩展库
内存泄露
或者循环引用(还有一种是全局容器里的对象没有删除)
前者无需讨论,后者举例如下(Obj('B')和Obj('C')的内存没有回收)
[dongsong@localhost
python
_study]$ cat leak_test2.py
#encoding=utf-8
在网络开发中,不可避免的会与许多标准通讯协议打交道。在这方面, Netty 为开发者提供了很大的便利。 Netty 自身除了提供编解码机制外,还提供了大量现成协议的编解码支持,这部分支持的内容可以在包netty-codec中找到。当然也包括我们今天要讲述,对Http的支持。
有了对 HTTP 编解码协议的支持,我们完全可以使用 Netty 来开发一款 Web 容器或者符合需求的 HTTP 容...
Python
内存泄漏
是指在程序运行过程中,由于一些原因导致对象在不再使用的情况下仍然占用着内存空间。这种情况下,内存空间会逐渐被占满,导致程序崩溃或者变得异常缓慢。
Python
内存泄漏
的原因一般有以下几个:
1. 对象引用计数错误:
Python
采用引用计数机制来管理对象的内存,当对象的引用计数为 0 时,
Python
会自动回收该对象的内存。但是,如果对象的引用计数计算错误,可能会导致
内存泄漏
。
2. 循环引用:当两个或多个对象相互引用时,就会形成循环引用。这种情况下,即使这些对象不再被程序使用,
Python
也无法自动回收它们的内存,从而导致
内存泄漏
。
3. 未正确关闭文件或网络连接:如果程序未正确关闭文件或网络连接,可能会导致
内存泄漏
。
4. 大量创建对象:如果程序大量创建对象,并且这些对象不及时释放,也可能会导致
内存泄漏
。
为了避免
Python
内存泄漏
,可以采取以下措施:
1. 注意对象的引用计数,避免计算错误。
2. 避免循环引用,尽量使用 weakref 等机制来解决。
3. 确保正确关闭文件和网络连接。
4. 尽量避免大量创建对象,合理使用对象池等机制来优化内存使用。