`
wqy159
  • 浏览: 56041 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多

网站:JavaEye 作者:shallon 发表时间: 2007-08-17 14:16 此文章来自于 http://www.iteye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://www.iteye.com/topic/113464

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

对象池的对象很快由于超过了maxActive=5,多余的对象会被释放。


对象池的exhaustedAction="Wait",

maxThreadsActive=50

对象池的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);







《 又见内存泄露 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>

推荐相关文章:
  CXF 2.0 发布了
  我眼中的CXF之Bus




JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA


分享到:
评论

相关推荐

    内存管理奋斗

    本文主要围绕内存管理的几个关键知识点展开,包括多人协作时的内存泄露检查、非自动内存管理环境下的单例模式、类方法的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++的内存管理通过手工...

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

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

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

    第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