`
shallon
  • 浏览: 72351 次
  • 性别: 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~~
还有没有什么测试工具推荐哦
最近有在看测试~比较迷茫

相关推荐

    c++检测内存泄漏(如何检测内存泄漏)

    内存检测代码,主要通过重载的方式检测已经实现的代码中是否有内存泄漏,详细细节见code,在这里不多作说明,毕竟空间不多啊,呵呵,一切尽在代码中

    iOS内存泄漏调试工程

    为博客提供的内存泄漏调试的工程,更多的信息要见我的博客

    内存泄漏工具.rar

    内存泄漏检测工具leakdiag与LDParser,可用。 具体的操作过程等等可以见博客

    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下的性能与调整简介

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

    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 以及流行 开源...

    前端面试题基础篇293题

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

    CRichEditCtrlEx支持静态表情聊天类1.2

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

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

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

    API for Boehm Garbage Collector DLL

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

    coreseek4.1 支持多音字拼音索引 win64

    Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源...此为win64编译程序(2版,支持utf-8多音字,解决了一个内存泄露的bug)。win32(1版)下载地址:http://download.csdn.net/detail/wangshaner1/6192947

    OOP_注意

    便自动成为inline候选人函数符重载字符串小结(具体代码见string.h)防卫式声明类名数据放在private中函数放在public中构造函数,拷贝构造函数,拷贝赋值值函数,析构函数(数组删除) 带有指针成员的类,必须有copy...

    基于JavaScript的三维地图程序(仿e都市gis)

    1.已修正8.15 ie内存泄漏问题,chrome下可能还存在内存泄漏 2.增加图标定位功能 3.增加鼠标滚轮事件(http://yongzhi.blog.hexun.com/5057947_d.html) 4.通过jquery加载json数据文件(图标显示层数据) 2009-8-17 ...

    挖掘鸡_V7.1官方无壳版.zip

    挖掘鸡 v.6.5:修复6.0严重内存泄漏,请升级。12:57 2008-4-20 挖掘鸡 v.6.1:重写搜索内核,提供更高的搜索效率。19:09 2008-4-10 挖掘鸡 v.6.0:重写搜索内核,提供更高的搜索效率。19:09 2008-4-10 挖掘鸡 v.5.2...

    挖掘鸡最新版

    挖掘鸡 v.6.5:修复6.0严重内存泄漏,请升级。12:57 2008-4-20 挖掘鸡 v.6.1:重写搜索内核,提供更高的搜索效率。19:09 2008-4-10 挖掘鸡 v.6.0:重写搜索内核,提供更高的搜索效率。19:09 2008-4-10 挖掘鸡 v....

    百度注册机

    作者:腾袭 ... ... 更新说明 v2.1.1 fix 2012/4/25 ...2.修正已知的内存泄露问题; 3.修正已知的可能导致程序崩溃的bug; 4.大幅度优化内存管理效率; 5.增加显示已注册的马甲数量; 6.增加用户名干扰码语法检查功能等。

    微信/安卓端上传图片实现(单张上传,非微信jssdk

    微信最初为了防止安卓端选图片导致内存泄露的问题而禁止了input file调用手机文件,后来是否开放不太清楚,我写这篇文章的时候微信可以使用input file,但不支持h5中input的multiple属性,所以只能单张多次上传,...

Global site tag (gtag.js) - Google Analytics