一种Java内存泄漏分析方法及装置制造方法及图纸

技术编号:20484484 阅读:20 留言:0更新日期:2019-03-02 18:49
本发明专利技术实施例公开一种Java内存泄漏分析方法及装置,其中,方法包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。本发明专利技术实施例能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度。

【技术实现步骤摘要】
一种Java内存泄漏分析方法及装置
本专利技术实施例涉及计算机
,具体涉及一种Java内存泄漏分析方法及装置。
技术介绍
目前,针对程序的内存泄漏检查方式主要是内存快照分析与对比。具体的,测试人员在对程序测试过程中每隔预置时间抓取内存快照,并通过人工分析查找出相邻两次内存快照之间的差异,来找出那些没释放的对象。但是,利用上述现有的方法来检查内存泄漏需要测试人员对获取内存快照的时间的把握以及对业务有一定程度的了解,人工成本较高,而且获取内存快照的时间点容易出错,在设计上用作缓存的内存和没有及时释放的内存会被误判为泄漏的内存。
技术实现思路
由于现有方法存在上述问题,本专利技术实施例提出一种Java内存泄漏分析方法及装置。第一方面,本专利技术实施例提出一种Java内存泄漏分析方法,包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。可选地,所述根据所采集的对象快照和集合对象快照在线或离线进行对比分析,获得Java内存泄漏分析结果,包括:根据所采集的对象快照和集合对象快照,在线或离线进行对比分析,获得Java内存泄漏分析结果;和/或,所述采集集合对象快照和采集对象快照的动作是在检测到用户的触发指令时采集或者是按照预设时间定时采集。可选地,所述按照预设集合对象快照采集规则,采集集合对象快照,包括:预先定义一个弱引用集合存放需要关注的集合对象的弱引用,每隔预设时间段采集需要关注的集合信息上报数据库,形成一次集合对象快照;其中:未开启内存快照功能不采集;集合内元素个数未达到预设第一阈值不采集;对象生存时间未达到预设第二阈值不采集;如果采集的对象在上报前被回收了,所述弱引用集合自动清理掉该对象;上报前判断集合的当前状态,如果当前集合内元素个数减少到所述预设第一阈值以下,清除对当前集合的引用,不上报当前集合的信息。可选地,所述集合对象快照的采集利用了字节码注入技术,对所有实现了java.util.Collection和java.util.Map的类进行注入改造,所有对集合的写操作都先执行是否采集的判断。可选地,所述按照预设对象快照采集规则,采集对象快照,包括:每隔预设时间段采集一次对象数据,将数量到达预设第三阈值的类信息上报数据库,形成一次对象快照;其中:未开启内存快照功能不采集。可选地,所述对象快照的采集利用了java自身的jmap-histo:live功能,采集当前内存中垃圾回收GC后的活动对象,按照类型记录每个类的对象数目。可选地,在根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果之后,所述方法还包括:获取用户选取的指定时间段,读取指定时间段内的对象快照和集合对象快照的信息,计算增长最明显的预设数量个对象或集合对象将其数次快照信息生成折线趋势图展示给用户。第二方面,本专利技术实施例还提出一种Java内存泄漏分析装置,包括:分类模块,用于将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;第一采集模块,用于按照预设集合对象快照采集规则,采集集合对象快照;第二采集模块,用于按照预设对象快照采集规则,采集对象快照;分析模块,用于根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。第三方面,本专利技术实施例提供一种电子设备,包括:处理器、存储器、总线及存储在存储器上并可在第处理器上运行的计算机程序;其中,所述处理器,存储器通过所述总线完成相互间的通信;所述处理器执行所述计算机程序时实现上述方法。第四方面,本专利技术实施例提供一种非暂态计算机可读存储介质,所述存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述方法。由上述技术方案可知,本专利技术实施例提供的一种Java内存泄漏分析方法及装置,通过将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈,按照预设集合对象快照采集规则采集集合对象快照,按照预设对象快照采集规则采集对象快照,根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果,由此,能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度。附图说明为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些图获得其他的附图。图1为本专利技术一实施例提供的一种Java内存泄漏分析方法的流程示意图;图2为本专利技术一实施例提供的一种Java内存泄漏分析装置的结构示意图;图3为本专利技术一实施例提供的电子设备的实体结构示意图。具体实施方式下面结合附图,对本专利技术的具体实施方式作进一步描述。以下实施例仅用于更加清楚地说明本专利技术的技术方案,而不能以此来限制本专利技术的保护范围。图1示出了本专利技术一实施例提供的一种Java内存泄漏分析方法的流程示意图,如图1所示,本实施例的Java内存泄漏分析方法,包括:S1、将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈。S2、按照预设集合对象快照采集规则,采集集合对象快照。S3、按照预设对象快照采集规则,采集对象快照。S4、根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。在具体应用中,本实施例可以将所有所采集的对象快照和集合对象快照存入数据库,用户可以在线立即查看最新的快照数据,也可以在收到内存泄露预警后,查看历史快照数据分析泄露原因。在所述步骤S4中,可以根据所采集的对象快照和集合对象快照,在线或离线进行对比分析,获得Java内存泄漏分析结果,即本实施例支持在线和离线两种分析方式。在具体应用中,所述采集集合对象快照和采集对象快照的动作可以是在检测到用户的触发指令时采集或者可以是按照预设时间定时采集。可以理解的是,集合对象快照只关注集合,并且可以收集集合写操作的调用栈,这样做的意义在于内存泄露最终会体现为内存泄露的代码导致某种对象大量积累无法释放,而这种情况大部分都是集合元素或者集合元素间接引用的对象。这种情况下本实施步骤S4在进行对比分析时可以很容易通过集合对象快照分对比分析出有可能泄露的集合,然后通过收集调用栈定位到代码位置。可以理解的是,对象快照关注所有对象,但不会收集对象调用栈,在集合对象快照无法确定问题的情况下,只可能是某种对象直接被大量创建引用但没有放在集合里,这种情况下本实施步骤S4在进行对比分析时可以通过对象快照来分析出一组一段时间内增长最明显的对象。本专利技术实施例提本文档来自技高网...

【技术保护点】
1.一种Java内存泄漏分析方法,其特征在于,包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。

【技术特征摘要】
1.一种Java内存泄漏分析方法,其特征在于,包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。2.根据权利要求1所述的方法,其特征在于,所述根据所采集的对象快照和集合对象快照在线或离线进行对比分析,获得Java内存泄漏分析结果,包括:根据所采集的对象快照和集合对象快照,在线或离线进行对比分析,获得Java内存泄漏分析结果;和/或,所述采集集合对象快照和采集对象快照的动作是在检测到用户的触发指令时采集或者是按照预设时间定时采集。3.根据权利要求1所述的方法,其特征在于,所述按照预设集合对象快照采集规则,采集集合对象快照,包括:预先定义一个弱引用集合存放需要关注的集合对象的弱引用,每隔预设时间段采集需要关注的集合信息上报数据库,形成一次集合对象快照;其中:未开启内存快照功能不采集;集合内元素个数未达到预设第一阈值不采集;对象生存时间未达到预设第二阈值不采集;如果采集的对象在上报前被回收了,所述弱引用集合自动清理掉该对象;上报前判断集合的当前状态,如果当前集合内元素个数减少到所述预设第一阈值以下,清除对当前集合的引用,不上报当前集合的信息。4.根据权利要求3所述的方法,其特征在于,所述集合对象快照的采集利用了字节码注入技术,对所有实现了java.util.Collection和java.util.Map的类进行注入改造,所有对集合的写操作都先执行是否采集的判断。5.根据权利要求1所述的方法,其特征在...

【专利技术属性】
技术研发人员:易存道
申请(专利权)人:北京宝兰德软件股份有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1