`
shallon
  • 浏览: 73239 次
  • 性别: Icon_minigender_2
  • 来自: 0
文章分类
社区版块
存档分类
最新评论

又见内存泄露

阅读更多
1、首先是测试人员使用Loadrunner测试的过程中发现系统的吞吐率会随着时间而下降,在排除了测试数据分布不均的问题在测试,发现吞吐率保持稳定的一段时间后会陡然下降,平均事务处理时间陡然上升。于是,对系统的运行进行监控,在客户端压力平均的时候,系统内存两个小时内从500m上升到1G,基本上可以认定是内存泄露。
1.1系统的吞吐率图


1.2系统的平均事务处理时间图


2、添加 verbose:gc启动的参数,重新测试,发现每次Full GC后的对象空间持续缓慢增加,过了一段时间后,发现Miner GC无法释放空间,每次GC都是Full GC,到最后,Full GC也无法释放出空间出来。


3、安装netbean profile对系统使用情形进行监控,发现
a、堆内存的已使用空间缓慢增长,直到最大内存限制;


b、接近最大内存限制的时候,内存平均对象的年龄(Surviving Generations)急剧上升,见下图中的红线。
c、Relative Time Spendt in GC 直剧上升,分析,当GC占用的CPU大量时间,系统的吞吐率下降,和LoadRunner的测试结果是符合的。见下图中的蓝线



4、获取内存对象的静态映像,发现内存中占空间最大的几种存活对象的平均对象年龄都比较大,并且随着时间的增长,这几类对象占用的空间与平均对象年龄都不停的加大,见图。



5、查看这几种对象的分配时候的程序堆栈,发现这些对象是mule框架初始化组件对象的时候所创建,心中犯疑,什么促使mule框架不停的创建全局对象?

追踪了几条对象生成的路径,发现不断增长的对象似乎都是org.mule.providers.soap.xfire.transport.MuleLocalTransport产生的,例如,19m的HashMap$Entry[]由MuleLocalTransport的父类org.codehaus.xfire.transport.AbstractTransport构造的时候产生,17m的HashMap$Entry[]由MuleLocalTransport的createNewChannel的方法生成。每调用createNewChannel一次就会生成一个全局对象org.codehaus.xfire.transport.DefaultEndpoint。而MuleLocalTransport对象只有在初始化的时候才会生成全局对象。继续看代码发现可以在XFireServiceComponent的setDescriptor打印日志来确认mule是否不停创建全局对象。

6、在XFireServiceComponent的关键初始化方法setDescriptor中添加日志,编译、重新打包,替换原来的类。新的类每当setDescriptor被调用一次就打印一行日志。重新测试,发现每个一段时间setDescriptor就被调用一次。由于每调用setDescriptor一次,就会产生大量的全局对象,并且全局对象不被释放,导致堆内存的增长。

7、会让mule如此疯狂的原因是什么呢?详细查看mule的配置,逐步集中到对象池与线程池的配置: 发现对象池的配置maxActive=5,maxIdle=5 <pooling-profile maxactive="5" maxidle="5" exhaustedaction="GROW" maxwait="1000">,配置明显过小,在对象池的exhaustedAction="GROW" 。线程池的配置maxThreadsActive明显大于对象池的配置。这样mule肯定会创建对象,由于</pooling-profile> 对象池的对象很快由于超过了maxActive=5,多余的对象会被释放。
<pooling-profile maxactive="5" maxidle="5" exhaustedaction="GROW" maxwait="1000">
8、修改该配置maxActive=50,maxIdle=50,</pooling-profile> 对象池的exhaustedAction="Wait", <pooling-profile maxactive="5" maxidle="5" exhaustedaction="GROW" maxwait="1000">重新运行,</pooling-profile> maxThreadsActive=50 <pooling-profile maxactive="5" maxidle="5" exhaustedaction="GROW" maxwait="1000">。是运行了7个小时,内存正常。

9、由于</pooling-profile> 对象池的exhaustedAction="Wait"的情况下没有内存泄露,不等于说mule没有问题。mule放入对象池的对象是DefaultMuleProxy。为了与xfire集成,对象池放入一类特殊对象:
org.mule.impl.model.DefaultMuleProxy -〉org.mule.providers.soap.xfire.XFireServiceComponent
后者包含成员变量org.mule.providers.soap.xfire.transport.MuleLocalTransport与org.mule.providers.soap.xfire.transport.MuleUniversalTransport在对象池释放DefaultMuleProxy后没有得到释放。从netbeans profile的内存映像上看:这两个类的对象,生成对象的数目==存活的对象数目,一个都没有释放过。这两类对象又携带了大量的全局对象,导致内存泄露。

10、上述两类对象为什么无法释放?经过一番查找,发现在XFireServiceComponent的setDescriptor方法,对象被注册到org.codehaus.xfire.transport.DefaultTransportManager中去了,之后不见有unregister的操作。代码如下:
        getTransportManager().register(transport);
        getTransportManager().register(universalTransport);


分享到:
评论
32 楼 llade 2008-07-25  
VERY GOOD
31 楼 yuanye218 2008-07-25  
好文,顶顶顶
30 楼 lean1252 2008-06-28  
说的很好,以后有个解决问题的参考了:)
29 楼 zpple 2008-04-28  
很是精髓,但是没有做运维,还不是很懂。
28 楼 galaxystar 2007-10-31  
请问LZ的app 应用环境是?
27 楼 abcdzt 2007-10-31  
恩,这些天也在做内存泄漏的工作,体会很深,支持版主
26 楼 caisd 2007-10-31  
很不错的文章,内存溢出是很头疼的问题,要解决它不仅需要掌握工具,了解JAVA内存机制,还要对编程比较了解。
我最近也在了解这些,4开始的图应该是NetBean Profiler的吧?
25 楼 javaeyes 2007-10-30  
想知道从4开始那些图是什么工具生成的
24 楼 renbaowei 2007-10-30  
好东西,不错!
23 楼 chinata 2007-10-29  
非常好的解决思路和过程,mark一下以后可以参考
22 楼 1314520ln 2007-10-29  
不错~
21 楼 hc_face 2007-10-25  
likeblood 写道
这东西写得太刺激了。。。。
很有参考价值,请问在哪里下载 netbean profile和 Loadrunner
20 楼 likeblood 2007-10-25  
这东西写得太刺激了。。。。
19 楼 chen 2007-10-22  
chen 写道
昨天在这里评论了一下"写的不错"
被javaeye高知成了扣除用户积分10分还说俺是灌水
难道最近有了新名词?非要灌醋不行?
今天还是评论:"写的不错"
写的不错
18 楼 chen 2007-10-22  
昨天在这里评论了一下"写的不错"
被javaeye高知成了扣除用户积分10分还说俺是灌水
难道最近有了新名词?非要灌醋不行?
今天还是评论:"写的不错"
17 楼 chen 2007-10-21  
写的挺好的啊
16 楼 hc_face 2007-10-17  
请问在哪里可以下到 loadrunner。

我们项目的系统也经常 内存泄漏呀。
15 楼 hc_face 2007-10-17  
鼓掌....,学习ssss
14 楼 backbase 2007-10-17  
很好!
13 楼 lixiao 2007-10-12  
很详细~~
学习ing~~
还有没有什么测试工具推荐哦
最近有在看测试~比较迷茫

相关推荐

    内存管理奋斗

    本文主要围绕内存管理的几个关键知识点展开,包括多人协作时的内存泄露检查、非自动内存管理环境下的单例模式、类方法的autorelease特性、Block在ARC和MRC下的行为差异、内存泄漏与内存溢出的识别以及JSON解析时的...

    Vue优化:常见会导致内存泄漏问题及优化详解

    如果你在用 Vue 开发应用,那么就要当心内存泄漏的问题。这个问题在单页应用 (SPA) 中尤为重要,因为在 SPA 的设计中,用户使用它时是不需要刷新浏览器的,所以 ...这个问题见上篇博客,vue自定义指令导致的内存

    冰月无忧.录屏 2.0.0.19 bywyLuping2.exe

    (内存泄露^_^) 2.0.0.18 悬浮窗+托盘操作。 mp4和avi采用h264编码,多线程根据CPU线程数适当-1或-2。如果自信自己的电脑可手动设置。 gif内存操作貌似出了点问题,又改回文件操作了...老牛拉车。 总体来说自己觉得...

    .net 程序性能测试软件

    1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多 2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用...9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科

    Diamond:D 内存调试器和分析器

    Diamond 的目的主要是方便调试内存泄漏(伪指针引用的数据)。 D2 支持仍在开发中。 D1 版本可以在 d1 分支上找到。 随着开发的继续,日志文件格式可能会发生变化。 钻石运行时配置 将DIAMOND_LOG设置为某些内容...

    Oracle在Solaris下的性能与调整简介

    是内存泄漏,磁盘子系统瓶颈,还是某个特定应用程序在可扩展性方面有限制?有一些途径可以发现和了解引起性能问题的根源,并且有可能消除它。本文给出了从哪里入手的一些建议。文中介绍了如何着手性能方面的考虑以及...

    C++编程艺术

    这种方式对程序员来说更简单,因为它消除了显式内存释放的需要,减少了内存泄漏的可能性。但是,自动垃圾回收也有其缺点,它可能会引入额外的性能开销,并且程序员对内存管理的控制力减弱。 C++的内存管理通过手工...

    c程序开发中长见问题50条

    在使用之前确保指针已正确初始化,并在不再需要时释放动态分配的内存,以防内存泄漏。 16. **向函数传递参数有几种方法?有什么不同?** 函数参数可以通过值、引用或指针传递。值传递会创建参数的副本,引用和指针...

    netty-all-4.1.29.Final-sources.jar 最新版netty源码

    Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Facebook 和 Instagram 以及流行 开源...

    第04章 大促高并发系统下JVM如何调优指导01.pdf

    高并发系统可能面临的问题包括服务突然停止运行、内存溢出异常、以及硬件升级后性能未见提升等。为了有效地解决这些问题,架构师需要知道如何对JVM进行调优。 接着,让我们再次认识Java。Java技术体系不仅限于Java...

    ucOS-II入门教程(任哲)-我见过的讲得最好的RTOS讲解ppt

    μC/OS-II需要管理内存分配,确保任务能有效地使用内存,同时避免内存泄漏。它可能包括动态内存分配和释放,以及内存池的概念,以优化内存的使用。 硬件抽象层(HAL)是μC/OS-II和其他操作系统的一个重要组成部分,...

    前端面试题基础篇293题

    包含第一部分html,第二部分CSS,第三部分JavaScript,第四部分Jquery,第五部分Bootstrap,第六部分微信小程序,第七部分webpack,第八部分常用编程题,第九部分其他常问内容如负载均衡、CDN、内存泄露、babel原理、js...

    JAVA性能分析

    当Java应用程序出现内存溢出的情况时,可以使用Jvisualvm等工具来获取当前Java虚拟机(JVM)的堆文件,进而分析内存泄漏等问题。 1. **准备Jvisualvm工具**: Jvisualvm是JDK自带的性能监控和分析工具。在Windows...

    CRichEditCtrlEx支持静态表情聊天类1.2

    平时我们在做IM聊天之类的软件的时候,一般都会使用Rich Edit控件来作为聊天编辑框和聊天记录框的控件在Visual Studio 2008 SP1下扩展了些功能,比如解码转义字符、编码转义字符、自动检测...1.2版本更新修复内存泄露

    信息技术教育之我见.zip

    学生需要知道计算机系统的基本组成,如CPU、内存、硬盘等,以及操作系统如何管理这些资源。同时,掌握常用软件的使用,如办公套件(如Microsoft Office)和图像处理工具(如Photoshop),是日常学习和工作中必不可少...

    图片游览器 效果见描述

    11. **性能优化**:考虑到图片可能很大,框架采用了延迟加载和内存管理策略,避免内存泄露和性能瓶颈。 在实际开发中,使用GKPhotoBrowser可以极大地简化图片浏览功能的实现,提高应用的用户满意度。通过将这个框架...

    C 语 言 常 见 错 误

    - **内存管理**:忘记释放动态分配的内存会导致内存泄漏,养成及时释放的习惯。 3. **算法问题**: - **边界条件错误**:在处理数组、字符串或循环时,未充分考虑边界条件,可能导致越界访问,引发运行时错误。 ...

    EVC下的图象任意角度旋转代码

    使用EVC做出来的图片高质量高速度任意角度旋转的代码,应该不多见,经过严格测试没有内存泄漏的这些问题。

    API for Boehm Garbage Collector DLL

    自动垃圾回收虽然会对性能造成一定的影响,但在大对对性能要求不是特别苛刻的场合下,使用自动垃圾回收技术可以极大的方便软件开发,降低由内存泄漏所引发的问题。 C++的自动垃圾回收库早就有了几个,商业和非商业的...

Global site tag (gtag.js) - Google Analytics