如何定位native内存泄露问题?

问题描述

环境:WinXP + SUN JDK 6.0 + RCP + AutoMan(Rational Functional Tester)问题描述:  测试人员用AutoMan(测试部自主开发的一套Java自动化测试工具,封装IBM的RFT)对RCP应用程序进行GUI自动化测试.运行一段时间后,程序出现异常:部分操作无法进行.异常日志如下:java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Unknown Source)at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:387)at com.huawei.unistar.quoter.framework.guide.internal.GuideDialog.run(GuideDialog.java:585)at com.huawei.unistar.quoter.framework.guide.internal.GuidePage.needShowPage(GuidePage.java:99)at com.huawei.unistar.quoter.framework.guide.internal.Guide.getStartingPage(Guide.java:123)at org.eclipse.jface.wizard.WizardDialog.showStartingPage(WizardDialog.java:1173) 此时在任务管理器里面发现进程内存大小几乎达到1.3G问题分析:  1,首先怀疑是JVM堆空间内存泄露.于是用jmap生成dump文件,使用MAT工具进行OOM分析,发现JVM堆空间使用情况良好(设置最大堆空间为512M,而程序出现问题时,堆空间也就使用了300M左右).而且也没有发现内存泄露点.    2,然后怀疑是自动化工具引起的native内存泄露.因此特地手工重复测试一遍,结果显示:程序运行良好,jvm堆空间大小一直稳定在一个区间;而且用工具分析,也没有发现内存泄露.       根据上面两个步骤地分析,因此我们怀疑是自动化工具(或测试用例)引起的native内存泄露.苦于对AutoMan和RFT工具(无源码)的不了解,不好从java层面下手分析问题.  所以想逆过来分析:从native内存着手,找出内存泄露的原因!  烦请专家指点如何分析native内存? 问题补充: uncontrolsheep 写道

解决方案

我觉得这种情况一般都是被测试场景的原因比较多一点。1.是否测试流程没有走完就报错了(有可能自动测试逻辑里面有闭环?)。2.有可能是多线测试环境程造成的并发环境下的原因。手工测试一般都是单线程逻辑的,而你说手工测试流程没有什么明显问题。3.其他原因(业务逻辑bug,JDK bug,测试工具bug)
解决方案二:
关注,看情况应该是线程产生过多导致的OOM,是不是测试工具产生了线程没有关闭造成的?具体是多久时间报错呢?

时间: 2024-12-27 07:13:01

如何定位native内存泄露问题?的相关文章

利用linux的mtrace命令定位内存泄露(Memory Leak)

  一谈到内存泄露, 多数程序员都闻之色变. 没错, 内存泄露很容易引入, 但很难定位.  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存泄露积累到一定程度,  那就是各种卡死了, 系统异常, 最后死机, 不得不重启.         如果搞开发, 遇到内存泄露问题, 那就呵呵了. 你可能先得花好几天来复现问题(泄露积累), 然后需要花好几天来定位问题和修改问题, 然后又要花好几天来验证问题, 而且, 很有可能没法一次改好, 上述

聊聊内存泄露

一.Java内存回收机制  不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在

利用任务管理器侦测GDI内存泄露

打开任务管理器,点击菜单"查看"--"选择列",勾上所有项,"确定".运行自己的程序,进行各种操作,并查看任务管理器中GDI对象和句柄数的变化.         如果在某次可逆操作中,例如,弹出一个对话框,然后关闭,GDI对象或句柄数先增加了,然后减少了,但是总量还是增加了,说明存在内存泄露,GDI对象没有被及时回收.如果句柄数出现类似情况,则情况复杂很多.         接下来,注释掉某些代码,编译运行并继续观察,逐步定位导致内存泄露的代码段

Eclipse Memory Analyzer以及内存泄露的原因

Eclipse Memory Analyzer是一个非常棒的堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露的原因.       可能有的同学会问,JVM不是号称自动内存管理,GC会自动垃圾回收,Java怎么会有内存泄露,不会搞错吧?当然不会^_^, Java的内存泄露不同于C/C++的内存泄露,C/C++的内存泄露是由于使用了堆内存(new/malloc)却没有释放(delete/free),导致无法再使用到该内存片,而Java的内存泄露是无

穆客带你快速定位Node.js内存泄露

在7月7日的云栖TechDay活动上,来自阿里云的穆客给大家分享了<如何快速定位Node.js内存泄露>话题.此次分享主要包括Node.js和APM的简单介绍.Node.js内存管理.Node.js内存泄露及其排查过程四个方面. 下面是现场分享观点整理. 大家好,我是来自阿里云的穆客,今天分享的是关于Node.js方面的故障排查.内存泄露的话题. Node.js和APM 很多人应该都知道Node.js,它是一个运行于服务端的基于Chrome V8引擎的 JavaScript 运行环境,Node

FastMM 定位内存泄露的代码位置

FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在Delphi2007以后版本中,使用更加简单,只需要在工程开始的位置加上语句: ReportMemoryLeaksOnShutdown := True;就可以了,并且在运行时不会出现提示.如果想要生成文件报告,还需要FastMM4,Delphi中没有别的设置可以生成文件报告. 可以修改FastMM4

使用按键精灵+umdh定位内存泄露问题的方式

使用按键精灵+umdh定位内存泄露问题的方式 一.配置方法 1. 安装windbg版本,必须安装:X86 Debuggers And Tools-x86_en-us.msi 2. 安装windows相关pdb和客户端程序对应的pdb. a) 比如:F:\symbols下创建两个目录,windows存放操作系统pdb, pdb目录存放播放器pdb.Pdb一定要与运行的播放器版本完全匹配,否则定位结果没意义 3. 配置环境变量 a) 将windbg的路径配置到path环境变量中 path=C:\Pr

android内存泄露分析工具MAT详解

一.准备 1.什么是MAT Eclipse提供的一个内存分析工具.它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗. android studio未集成该插件 需要你下载独立版 android studio的DDMS可以生成hprof是什么文件,不过需要进行一下格式转化(.hprof文件从Dalvik格式转换成J2SE HPROF格式),才可以导入MAT独立版软件. 2.hprof是什么文件 heap dumps,中文翻译,堆转储,快照.即堆内存某个时刻的情

Android内存泄露总结(附内存检测工具)

Java 中的内存分配 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它的内存空间也将被释放掉,该内存空间可以被重新使用. 堆内存用于存