免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8733 | 回复: 15
打印 上一主题 下一主题

Perl脚本的内存泄漏如何检测? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-27 18:08 |只看该作者 |倒序浏览
20可用积分
本帖最后由 huhuegg 于 2013-04-07 17:06 编辑

写的Perl TCP服务端使用top命令查看发现每小时占用的RSS内存增加1-2M,请教如何排查~~~

用Devel::Size跟踪了脚本所有全局变量都没有增大,
lsof查看也一直没有变化
尝试用pmap看看也没有增大

论坛徽章:
0
2 [报告]
发表于 2013-02-27 18:18 |只看该作者
Perl有自动垃圾回收机制,但有一种结构无法自动回收:循环引用。
就是两个变量互相引用对方。
只能手动强制回收。
undef $cross_reference_var;
另外如果一个数据结构中有一个变量无法回收,这个数据结构也就成了越来越大的垃圾。
也需要手动将不在使用的变量一一手动清除。

论坛徽章:
0
3 [报告]
发表于 2013-02-27 18:40 |只看该作者
本帖最后由 huhuegg 于 2013-02-27 18:44 编辑

请教如何能够找到这些可能需要手动回收的循环引用?
贪图方便,脚本里面到处都是引用...
在这种环境应该怎样使用Devel::Cycle呢? 如何判断是需要回收的而不是正在使用的呢?

论坛徽章:
0
4 [报告]
发表于 2013-02-27 20:29 |只看该作者
把代码块设计成函数,然后,将函数组合起来。减少代码之间的耦合关系,许多问题就显明出来了

论坛徽章:
0
5 [报告]
发表于 2013-02-27 20:33 |只看该作者
本帖最后由 huhuegg 于 2013-02-27 20:41 编辑

不太明白
sub有很多,传入传出的内容也很多...
就是不知道怎么排查好

论坛徽章:
0
6 [报告]
发表于 2013-02-28 17:37 |只看该作者
本帖最后由 huhuegg 于 2013-03-01 09:37 编辑

在AnyEvent的文档中有看到以下描述:
BUGS
Perl 5.8 has numerous memleaks that sometimes hit this module and are hard to work around. If you suffer from memleaks, first upgrade to Perl 5.10 and check wether the leaks still show up. (Perl 5.10.0 has other annoying memleaks, such as leaking on map and grep but it is usually not as pronounced).

我将Perl的版本从5.8.x升级到了5.16,pp后再运行内存比以前增加得慢了,纠结的是还有连续增长...
12个小时,增加了15M

论坛徽章:
0
7 [报告]
发表于 2013-04-25 21:27 |只看该作者
已经将部分代码写成PM了,
检查用的是find_cycle 和 Test::LeakTrace::Script
没有检查出内存泄露
但是内存还是会缓慢增加....

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
8 [报告]
发表于 2013-04-26 09:02 |只看该作者
笨办法
压力测试,加快问题暴露,
挨个隔离函数,
定位有问题的函数

论坛徽章:
0
9 [报告]
发表于 2013-04-26 09:47 |只看该作者
huhuegg 发表于 2013-02-28 17:37
在AnyEvent的文档中有看到以下描述:
BUGS
Perl 5.8 has numerous memleaks that sometimes hit this mo ...

在安装EV的情况下,AnyEvent算是C写的模块,使用不正确什么问题都可能出现。我记得作者在文档中就多处提到这点
你发的第一个帖子:http://bbs.chinaunix.net/thread-4077300-1-2.html
不知道你有没有改正?你这个写法是错误的,已经纠正了吗?

论坛徽章:
0
10 [报告]
发表于 2013-04-26 11:03 |只看该作者
本帖最后由 huhuegg 于 2013-04-26 11:03 编辑

不是一个$cv->wait就可以的么?
如果添加$cv->send不是脚本就退出了么? 这个怎么用不明白  
push_read这里还没改到,主要还是不熟悉..

现在只是将各块可复用的内容都挖出来单独写模块,强制在DESTROY里面清理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP