四. 如何检测和处理内存泄漏

如何查找引起内存泄漏的原因一般有两个步骤:第一是安排有经验的编程人员对代码进行走查和分析,找出内存泄漏发生的位置;第二是使用专门的内存泄漏测试工具进行测试.

第一个步骤:在代码走查的工作中,可以安排对系统业务和开发语言工具比较熟悉的开发人员对应用的代码进行了交叉走查,尽量找出代码中存在的数据库连接声明和结果集未关闭、代码冗余等故障代码.

第二个步骤:就是检测 Java 的内存泄漏.在这里我们通常使用一些工具来检查 Java 程序的内存泄漏问题.市场上已有几种专业检查 Java 内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测 Java 程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化.开发人员将根据这些信息判断程序是否有内存泄漏问题.这些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等.

4.1检测内存泄漏的存在
这里我们将简单介绍我们在使用Optimizeit检查的过程.通常在知道发生内存泄漏之后,第一步是要弄清楚泄漏了什么数据和哪个类的对象引起了泄漏.

一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长的.同样,对任何一个类的对象的使用个数也有一个相对稳定的上限,不应该是持续增长的.根据这样的基本假设,我们持续地观察系统运行时使用的内存的大小和各实例的个数,如果内存的大小持续地增长,则说明系统存在内存泄漏,如果特定类的实例对象个数随时间而增长(就是所谓的“增长率”),则说明这个类的实例可能存在泄漏情况.

另一方面通常发生内存泄漏的第一个迹象是:在应用程序中出现了OutOfMemoryError.在这种情况下,需要使用一些开销较低的工具来监控和查找内存泄漏.虽然OutOfMemoryError也有可能应用程序确实正在使用这么多的内存;对于这种情况则可以增加JVM可用的堆的数量,或者对应用程序进行某种更改,使它使用较少的内存.

但是,在许多情况下,OutOfMemoryError都是内存泄漏的信号.一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加.如果确实如此,就可能发生了内存泄漏.

4.2处理内存泄漏的方法
一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会发生泄漏.JVM自己是不会告诉您的.这些专业工具从JVM获得内存系统信息的方法基本上有两种:JVMTI和字节码技术(byte code instrumentation). Java 虚拟机工具接口( Java Virtual Machine Tools Interface,JVMTI)及其前身 Java 虚拟机监视程序接口( Java Virtual Machine Profiling Interface,JVMPI)是外部工具与JVM通信并从JVM收集信息的标准化接口.字节码技术是指使用探测器处理字节码以获得工具所需的信息的技术.

Optimizeit是Borland公司的产品,主要用于协助对软件系统进行代码优化和故障诊断,其中的Optimizeit Profiler主要用于内存泄漏的分析.Profiler的堆视图就是用来观察系统运行使用的内存大小和各个类的实例分配的个数的.

首先,Profiler会进行趋势分析,找出是哪个类的对象在泄漏.系统运行长时间后可以得到四个内存快照.对这四个内存快照进行综合分析,如果每一次快照的内存使用都比上一次有增长,可以认定系统存在内存泄漏,找出在四个快照中实例个数都保持增长的类,这些类可以初步被认定为存在泄漏.通过数据收集和初步分析,可以得出初步结论:系统是否存在内存泄漏和哪些对象存在泄漏(被泄漏).

接下来,看看有哪些其他的类与泄漏的类的对象相关联.前面已经谈到 Java 中的内存泄漏就是无用的对象保持,简单地说就是因为编码的错误导致了一条本来不应该存在的引用链的存在(从而导致了被引用的对象无法释放),因此内存泄漏分析的任务就是找出这条多余的引用链,并找到其形成的原因.查看对象分配到哪里是很有用的.同时只知道它们如何与其他对象相关联(即哪些对象引用了它们)是不够的,关于它们在何处创建的信息也很有用.
  转自: 雨后池塘 (www.YuHou.net)
最后,进一步研究单个对象,看看它们是如何互相关联的.借助于Profiler工具,应用程序中的代码可以在分配时进行动态添加,以创建堆栈跟踪.也有可以对系统中所有对象分配进行动态的堆栈跟踪.这些堆栈跟踪可以在工具中进行累积和分析.对每个被泄漏的实例对象,必然存在一条从某个牵引对象出发到达该对象的引用链.处于堆栈空间的牵引对象在被从栈中弹出后就失去其牵引的能力,变为非牵引对象.因此,在长时间的运行后,被泄露的对象基本上都是被作为类的静态变量的牵引对象牵引.

总而言之, Java 虽然有自动回收管理内存的功能,但内存泄漏也是不容忽视,它往往是破坏系统稳定性的重要因素.

如何检测和处理内存泄漏相关推荐

  1. 用V C++检测和隔离内存泄漏

    具有动态的分配和释放内存的能力是C/C++程序语言的重要特色之一.Visual C++ debugger 和 CRT库提供了一系列有效的检测和鉴定内存泄漏的工具. 设置内存泄漏检测 检测内存泄漏的基本 ...

  2. Java 技术篇-用java自带的内存检测工具排查内存泄漏问题,查看java垃圾回收情况,监控java堆内存变化

    在 java 的 bin 文件夹下有个 jvisualvm.exe 工具,使用它可以检测到 java堆内存 的变化情况,借此可以来检测使用 java 的程序是否存在内存泄漏问题. 我们左边选择程序对应 ...

  3. android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary

    首先了解什么是内存泄露html http://liuwangshu.cn/application/performance/ram-3-memory-leak.htmlandroid 1Leakcanc ...

  4. qt内存泄漏检测_qt 关于内存泄漏的检测

    Qt 关于内存泄露的检测: 工具篇关于Qt 内存泄露的检测工具有很多种,一下挑几种来说: 1.检测已分配资源, 第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用 按 ...

  5. 【内存】内存检测工具sanitizer[内存泄漏、内存越界] VS valgrind

    简介 Sanitizers是谷歌发起的开源工具集,包括了AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer,Saniti ...

  6. 关于LeakCanary检测华为手机内存泄漏问题

    手机华为:pra-al00,Android 8.0.0, 继承LeakCanary后,所有的activity均会爆出leaks, ...... references com.android.inter ...

  7. VC使用CRT调试功能来检测内存泄漏

    信息来源:csdn      C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证 ...

  8. linux工具之检测内存泄漏-valgrind

    0.前言 内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏: valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项 ...

  9. VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]

    /C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证了这句话.在 C/C++ 应用程 ...

最新文章

  1. 《C#精彩实例教程》小组阅读10 -- C#属性与方法
  2. Spring 泛型依赖注入
  3. FragmentManager中Fragment的重复创建、复用问题
  4. python在日常工作处理中的应用-近期工作中应用Python的一些经验总结
  5. CF-1209 F. Koala and Notebook(建图BFS)
  6. Windows下自动备份Oracle数据库
  7. WordPress 图片防盗链的方法
  8. python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构
  9. 零基础学python用哪本书好-零基础想要学习Python编程 ,不知道看哪本书?
  10. 小马哥-Java 微服务实践 - Spring Boot 系列-01Java 微服务实践 - Spring Boot 系列(一)初体验...
  11. linux上apk免杀,kali 免杀工具shellter安装以及使用(示例代码)
  12. f2fs系列之一:实战f2fs 下载、编译和挂载 [转载系列]
  13. Win7操作系统:请求的操作需要提升
  14. WhatsAPP营销详细攻略,带你一镜到底的了解WhatsAPP营销
  15. 【WangEditor】使用富文本编辑器 WangEditor 实现用户自定义图片大小(改js源码)
  16. visibility与display的区别:
  17. tp5:为什么find()出来的数据有时候可以用toArray() 有时候会报错?
  18. 苹果手机各种型号图片_苹果平板电脑图片欣赏及各型号介绍【图文】
  19. Python 可视化神器--Plotly
  20. pip.ini的建立

热门文章

  1. 最酷的windows后门
  2. 个体工商户核名查询_秒懂!个体工商户注册无需到窗口“预先核名”,自主申报“15图搞定”!...
  3. 使用NCR防范xss。
  4. php自动生成phpunit,使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
  5. IOS去除文件后缀名
  6. 旅行app(游记、攻略、私人定制) | 顺便游旅行H5移动端实例
  7. 中国FPGA芯片技术解析
  8. 潭州学院html学习(day10)
  9. 2018(2017)美图java服务端笔试(回忆录)
  10. 我们见面吧,钛媒体年度国际大会“坚定”来了!