首页 > OOP语言 > 其它 > 正文

利用性能探测器分析内存泄漏
2013-10-28 00:00:00   来源:www.bianceng.cn   评论:0 点击:

暂时无描述信息

在之前发表的文章“如何使用性能探测器的 *STATS和*PROFILE/PGM功能”里面,我解释了性能探测器的*STATS和*PROFILE数据集合类型,使用这两种集合类型可以非常便捷的进行数据收集,并能很容易的分析出CPU时间被哪些地方所使用。在这篇文章里,我将切换一下角度,去集中分析内存泄漏问题。内存泄漏是指那些在堆里分配的、但是无法被释放或者无法被重新分配的内存。这是在C/C++代码中很常见的问题,通常是由于程序员的疏忽,导致应用程序在进入某个异常甚至是正常的分支时没能正确的释放内存资源,程序员的技术水平决定了代码中是否有内存泄漏风险。

注意:这个讨论不适用于Java堆,因为Java从系统内存存储区创建自己的堆区,在Java堆区分配的内存空间最终将被垃圾回收器自动清理。

收集数据

为了能够收集到分析内存泄漏所需要的数据,必须要收集堆存储事件,其中包括系统堆、用户堆、常驻堆、本地堆、激活组堆、基于处理的堆以及C运行时堆(V5R3之后才支持的新功能)。要想收集到包括C运行时在内所有的这些事件,需要遵循以下步骤。

1. 给环境变量QYPE_ALLHEAP设置一个有效的值:

ADDENVVAR QYPE_ALLHEAP VALUE(ALL)

使用这个变量的原因是C运行时堆事件功能在发布到V5R3版本的时候,并没有对命令ADDPEXDFN做相应的修改。在未来版本(V6R1以后的版本)中,*CLEHEAP事件将会在ADDPEXDFN命令的STGEVT参数中被支持,因此就不需要再对这个环境变量进行设置了。

2. 现在使用ADDPEXDFN命令为堆事件添加定义。在参数中指定堆存储事件,上一步设置的环境变量将会使得所有的其他堆事件都被添加。

ADDPEXDFN DFN(HEAPTRC) TYPE(*TRACE) TRCTYPE(*SLTEVT) SLTEVT(*YES) STGEVT(*USRHEAP) JOB(*ALL) TASK(*ALL) MAXSTG(100000)

3. 删除之前设置的环境变量,这样可以避免以后你不经意当中创建一个包括了所有堆事件的定义。

RMVENVVAR ENVVAR(QYPE_ALLHEAP)

4. V5R2版本不支持*CLEHEAP事件,所以你需要遵循下面的定义来指定所有V5R2支持的堆事件。

ADDPEXDFN DFN(HEAPTRC) TYPE(*TRACE) TRCTYPE(*SLTEVT) SLTEVT(*YES) STGEVT((*SYSHEAP) (*RESHEAP) (*LCLHEAP) (*USRHEAP) (*ACTGRPHEAP) (*HDLHEAP))  JOB(*ALL) TASK(*ALL) MAXSTG(100000)

5. 现在有可以启动性能探测器的跟踪日志功能:

STRPEX SSNID(ALLHEAP) DFN(HEAPTRC)

这将使得性能探测器跟踪系统上所有作业以及任务的堆活动情况,直到收集的数据量达到100MB或者人为终止跟踪日志为止。

6. 使用下面的命令来结束跟踪日志程序:

ENDPEX SSNID(ALLHEAP)

相关热词搜索:

上一篇:Csv文件转Tab文件的代码
下一篇:调试脚本将帮助你更有效地使用调试器

分享到: 收藏