CN109408383B - 一种Java内存泄漏分析方法及装置 - Google Patents

一种Java内存泄漏分析方法及装置 Download PDF

Info

Publication number
CN109408383B
CN109408383B CN201811188866.4A CN201811188866A CN109408383B CN 109408383 B CN109408383 B CN 109408383B CN 201811188866 A CN201811188866 A CN 201811188866A CN 109408383 B CN109408383 B CN 109408383B
Authority
CN
China
Prior art keywords
snapshot
preset
collected
objects
object snapshot
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201811188866.4A
Other languages
English (en)
Other versions
CN109408383A (zh
Inventor
易存道
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Baolande Software Co ltd
Original Assignee
Beijing Baolande Software Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Baolande Software Co ltd filed Critical Beijing Baolande Software Co ltd
Priority to CN201811188866.4A priority Critical patent/CN109408383B/zh
Publication of CN109408383A publication Critical patent/CN109408383A/zh
Application granted granted Critical
Publication of CN109408383B publication Critical patent/CN109408383B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Memory System (AREA)

Abstract

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

Description

一种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在进行对比分析时可以通过对象快照来分析出一组一段时间内增长最明显的对象。
本发明实施例提供的Java内存泄漏分析方法,利用处理器实现,通过将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈,按照预设集合对象快照采集规则采集集合对象快照,按照预设对象快照采集规则采集对象快照,根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果,由此,能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度。
进一步地,在上述实施例的基础上,所述步骤S2可以包括:
预先定义一个弱引用集合存放需要关注的集合对象的弱引用,每隔预设时间段采集需要关注的集合信息上报数据库,形成一次集合对象快照;其中:
未开启内存快照功能不采集;
集合内元素个数未达到预设第一阈值不采集;
对象生存时间未达到预设第二阈值不采集;
如果采集的对象在上报前被回收了,所述弱引用集合自动清理掉该对象;
上报前判断集合的当前状态,如果当前集合内元素个数减少到所述预设第一阈值以下,清除对当前集合的引用,不上报当前集合的信息。
可以理解的是,集合内元素个数未达到预设第一阈值不采集,是因为小集合不可能引发内存泄漏,所述预设第一阈值可根据实际情况进行设置,本实施例并不对其进行限制。
可以理解的是,对象生存时间未达到预设第二阈值不采集,是因为内泄漏是个积累的过程只有一段时间后没有被回收的对象才值得关注。
具体地,所述集合对象快照的采集可以利用字节码注入技术,对所有实现了java.util.Collection和java.util.Map的类进行注入改造,所有对集合的写操作都先执行是否采集的判断。
可以理解的是,将快照信息分为对象快照和集合对象快照两类,并按照预设集合对象快照采集规则采集集合对象快照,与jmap的快照相比大大减少了快照的大小,从上千万字节缩小到几千字节,并且数据是拆分上报的可以不经过解析多个快照直接跟踪某个对象的数量变化趋势。
进一步地,在上述实施例的基础上,所述步骤S3可以包括:
每隔预设时间段采集一次对象数据,将数量到达预设第三阈值的类信息上报数据库,形成一次对象快照;其中:
未开启内存快照功能不采集。
具体地,所述对象快照的采集可以利用java自身的jmap-histo:live功能,采集当前内存中GC(垃圾回收)后的活动对象,按照类型记录每个类的对象数目。
可以理解的是,将快照信息分为对象快照和集合对象快照两类,并按照预设对象快照采集规则采集对象快照,与jmap的快照相比大大减少了快照的大小,从上千万字节缩小到几千字节,并且数据是拆分上报的可以不经过解析多个快照直接跟踪某个对象的数量变化趋势。
进一步地,在上述实施例的基础上,在所述步骤S4之后,本实施例所述方法还可以包括:
获取用户选取的指定时间段,读取指定时间段内的对象快照和集合对象快照的信息,计算增长最明显的预设数量个对象或集合对象将其数次快照信息生成折线趋势图展示给用户。
可以理解的是,通过点击所述折线趋势图上的点可以看到这一次快照时这个对象的详细信息。
可以理解的是,利用折线趋势图的对象趋势可以选择忽略java的基本数据类型来提高定位精度。
本发明实施例提供的Java内存泄漏分析方法,可实现Java内存泄漏的分析,能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度,且支持在线和离线两种分析方式。
图2示出了本发明一实施例提供的一种Java内存泄漏分析装置的结构示意图,如图2所示,本实施例的Java内存泄漏分析装置,包括:分类模块21、第一采集模块22、第二采集模块23和分析模块24;其中:
所述分类模块21,用于将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;
所述第一采集模块22,用于按照预设集合对象快照采集规则,采集集合对象快照;
所述第二采集模块23,用于按照预设对象快照采集规则,采集对象快照;
所述分析模块24,用于根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。
具体地,所述分类模块21将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;所述第一采集模块22按照预设集合对象快照采集规则,采集集合对象快照;所述第二采集模块23按照预设对象快照采集规则,采集对象快照;所述分析模块24根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。
在具体应用中,本实施例可以将所有所采集的对象快照和集合对象快照存入数据库,用户可以在线立即查看最新的快照数据,也可以在收到内存泄露预警后,查看历史快照数据分析泄露原因。在所述分析模块24中,可以根据所采集的对象快照和集合对象快照,在线或离线进行对比分析,获得Java内存泄漏分析结果,即本实施例支持在线和离线两种分析方式。
在具体应用中,所述采集集合对象快照和采集对象快照的动作可以是在检测到用户的触发指令时采集或者可以是按照预设时间定时采集。
可以理解的是,集合对象快照只关注集合,并且可以收集集合写操作的调用栈,这样做的意义在于内存泄露最终会体现为内存泄露的代码导致某种对象大量积累无法释放,而这种情况大部分都是集合元素或者集合元素间接引用的对象。这种情况下本实施所述分析模块24在进行对比分析时可以很容易通过集合对象快照分对比分析出有可能泄露的集合,然后通过收集调用栈定位到代码位置。
可以理解的是,对象快照关注所有对象,但不会收集对象调用栈,在集合对象快照无法确定问题的情况下,只可能是某种对象直接被大量创建引用但没有放在集合里,这种情况下本实施所述分析模块24在进行对比分析时可以通过对象快照来分析出一组一段时间内增长最明显的对象。
本发明实施例提供的Java内存泄漏分析装置,应用于处理器,能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度。
进一步地,在上述实施例的基础上,所述第一采集模块22,可具体用于
预先定义一个弱引用集合存放需要关注的集合对象的弱引用,每隔预设时间段采集需要关注的集合信息上报数据库,形成一次集合对象快照;其中:
未开启内存快照功能不采集;
集合内元素个数未达到预设第一阈值不采集;
对象生存时间未达到预设第二阈值不采集;
如果采集的对象在上报前被回收了,所述弱引用集合自动清理掉该对象;
上报前判断集合的当前状态,如果当前集合内元素个数减少到所述预设第一阈值以下,清除对当前集合的引用,不上报当前集合的信息。
可以理解的是,集合内元素个数未达到预设第一阈值不采集,是因为小集合不可能引发内存泄漏,所述预设第一阈值可根据实际情况进行设置,本实施例并不对其进行限制。
可以理解的是,对象生存时间未达到预设第二阈值不采集,是因为内泄漏是个积累的过程只有一段时间后没有被回收的对象才值得关注。
具体地,所述集合对象快照的采集可以利用字节码注入技术,对所有实现了java.util.Collection和java.util.Map的类进行注入改造,所有对集合的写操作都先执行是否采集的判断。
可以理解的是,将快照信息分为对象快照和集合对象快照两类,并按照预设集合对象快照采集规则采集集合对象快照,与jmap的快照相比大大减少了快照的大小,从上千万字节缩小到几千字节,并且数据是拆分上报的可以不经过解析多个快照直接跟踪某个对象的数量变化趋势。
进一步地,在上述实施例的基础上,所述第二采集模块23,可具体用于
每隔预设时间段采集一次对象数据,将数量到达预设第三阈值的类信息上报数据库,形成一次对象快照;其中:
未开启内存快照功能不采集。
具体地,所述对象快照的采集可以利用java自身的jmap-histo:live功能,采集当前内存中GC(垃圾回收)后的活动对象,按照类型记录每个类的对象数目。
可以理解的是,将快照信息分为对象快照和集合对象快照两类,并按照预设对象快照采集规则采集对象快照,与jmap的快照相比大大减少了快照的大小,从上千万字节缩小到几千字节,并且数据是拆分上报的可以不经过解析多个快照直接跟踪某个对象的数量变化趋势。
进一步地,在上述实施例的基础上,本实施例所述装置还可以包括图中未示出的:
展示模块,用于获取用户选取的指定时间段,读取指定时间段内的对象快照和集合对象快照的信息,计算增长最明显的预设数量个对象或集合对象将其数次快照信息生成折线趋势图展示给用户。
可以理解的是,通过点击所述折线趋势图上的点可以看到这一次快照时这个对象的详细信息。
可以理解的是,利用折线趋势图的对象趋势可以选择忽略java的基本数据类型来提高定位精度。
本发明实施例提供的Java内存泄漏分析装置,可实现Java内存泄漏的分析,能够减少Java内存泄漏分析的人力消耗,降低对维护人员的能力要求,减少快照对磁盘的消耗,大大降低了对可能发生的内存泄露进行的预警和定位的技术难度,且支持在线和离线两种分析方式。
本实施例的Java内存泄漏分析装置,可以用于执行前述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
图3示出了本发明一实施例提供的一种电子设备的实体结构示意图,如图3所示,该电子设备可以包括:处理器301、存储器302、总线303及存储在存储器302上并可在处理器301上运行的计算机程序;
其中,所述处理器301和存储器302通过所述总线303完成相互间的通信;
所述处理器301执行所述计算机程序时实现上述方法实施例所提供的方法,例如包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。
本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法实施例所提供的方法,例如包括:将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;按照预设集合对象快照采集规则,采集集合对象快照;按照预设对象快照采集规则,采集对象快照;根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果。
本领域内的技术人员应明白,本申请的实施例可提供为方法、装置、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、装置、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置/系统。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。术语“上”、“下”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
本发明的说明书中,说明了大量具体细节。然而能够理解的是,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。类似地,应当理解,为了精简本发明公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释呈反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。本发明并不局限于任何单一的方面,也不局限于任何单一的实施例,也不局限于这些方面和/或实施例的任意组合和/或置换。而且,可以单独使用本发明的每个方面和/或实施例或者与一个或更多其他方面和/或其实施例结合使用。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。

Claims (10)

1.一种Java内存泄漏分析方法,其特征在于,包括:
将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;
按照预设集合对象快照采集规则,采集集合对象快照;
按照预设对象快照采集规则,采集对象快照;
根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果;其中,通过集合对象快照对比分析出有可能泄露的集合,通过收集调用栈定位到代码位置;在集合对象快照无法确定问题的情况下,通过对象快照来分析出一组一段时间内增长最明显的对象。
2.根据权利要求1所述的方法,其特征在于,所述根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结,包括:
根据所采集的对象快照和集合对象快照,在线或离线进行对比分析,获得Java内存泄漏分析结果;
和/或,
所述采集集合对象快照和采集对象快照的动作是在检测到用户的触发指令时采集或者是按照预设时间定时采集。
3.根据权利要求1所述的方法,其特征在于,所述按照预设集合对象快照采集规则,采集集合对象快照,包括:
预先定义一个弱引用集合存放需要关注的集合对象的弱引用,每隔预设时间段采集需要关注的集合信息上报数据库,形成一次集合对象快照;其中:
未开启内存快照功能不采集;
集合内元素个数未达到预设第一阈值不采集;
对象生存时间未达到预设第二阈值不采集;
如果采集的对象在上报前被回收了,所述弱引用集合自动清理掉该对象;
上报前判断集合的当前状态,如果当前集合内元素个数减少到所述预设第一阈值以下,清除对当前集合的引用,不上报当前集合的信息。
4.根据权利要求3所述的方法,其特征在于,所述集合对象快照的采集利用了字节码注入技术,对所有实现了java.util.Collection和java.util.Map的类进行注入改造,所有对集合的写操作都先执行是否采集的判断。
5.根据权利要求1所述的方法,其特征在于,所述按照预设对象快照采集规则,采集对象快照,包括:
每隔预设时间段采集一次对象数据,将数量到达预设第三阈值的类信息上报数据库,形成一次对象快照;其中:
未开启内存快照功能不采集。
6.根据权利要求5所述的方法,其特征在于,所述对象快照的采集利用了java自身的jmap-histo:live功能,采集当前内存中垃圾回收GC后的活动对象,按照类型记录每个类的对象数目。
7.根据权利要求1所述的方法,其特征在于,在根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果之后,所述方法还包括:
获取用户选取的指定时间段,读取指定时间段内的对象快照和集合对象快照的信息,计算增长最明显的预设数量个对象或集合对象将其数次快照信息生成折线趋势图展示给用户。
8.一种Java内存泄漏分析装置,其特征在于,包括:
分类模块,用于将快照信息分为对象快照和集合对象快照两类,其中,所述集合对象快照只关注集合并且可收集集合写操作的调用栈,所述对象快照关注所有对象,但不会收集对象调用栈;
第一采集模块,用于按照预设集合对象快照采集规则,采集集合对象快照;
第二采集模块,用于按照预设对象快照采集规则,采集对象快照;
分析模块,用于根据所采集的对象快照和集合对象快照进行对比分析,获得Java内存泄漏分析结果;其中,通过集合对象快照对比分析出有可能泄露的集合,通过收集调用栈定位到代码位置;在集合对象快照无法确定问题的情况下,通过对象快照来分析出一组一段时间内增长最明显的对象。
9.一种电子设备,其特征在于,包括:处理器、存储器、总线及存储在存储器上并可在处理器上运行的计算机程序;
其中,所述处理器,存储器通过所述总线完成相互间的通信;
所述处理器执行所述计算机程序时实现如权利要求1-7中任一项所述的方法。
10.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现如权利要求1-7中任一项所述的方法。
CN201811188866.4A 2018-10-12 2018-10-12 一种Java内存泄漏分析方法及装置 Active CN109408383B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811188866.4A CN109408383B (zh) 2018-10-12 2018-10-12 一种Java内存泄漏分析方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811188866.4A CN109408383B (zh) 2018-10-12 2018-10-12 一种Java内存泄漏分析方法及装置

Publications (2)

Publication Number Publication Date
CN109408383A CN109408383A (zh) 2019-03-01
CN109408383B true CN109408383B (zh) 2023-04-14

Family

ID=65467829

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811188866.4A Active CN109408383B (zh) 2018-10-12 2018-10-12 一种Java内存泄漏分析方法及装置

Country Status (1)

Country Link
CN (1) CN109408383B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110704313B (zh) * 2019-09-25 2023-07-25 北京宝兰德软件股份有限公司 Java虚拟机内存泄漏检测方法及装置
CN111258797B (zh) * 2020-01-13 2023-04-18 北京字节跳动网络技术有限公司 一种内存泄露的检测方法、装置、介质和电子设备
CN112463626B (zh) * 2020-12-10 2023-07-11 网易(杭州)网络有限公司 内存泄漏定位方法、装置、计算机设备及存储介质
CN114546590B (zh) * 2022-02-18 2023-03-14 北京基调网络股份有限公司 Java虚拟机堆内存集合对象监测方法及内存溢出分析方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101599048A (zh) * 2009-07-01 2009-12-09 福建星网锐捷网络有限公司 一种内存监控的方法和装置
CN105302714A (zh) * 2014-07-24 2016-02-03 腾讯科技(深圳)有限公司 一种测试过程中内存泄漏的监控方法和装置
CN106484580A (zh) * 2016-10-21 2017-03-08 腾讯科技(深圳)有限公司 一种内存检测方法、装置及系统
CN107632929A (zh) * 2017-08-21 2018-01-26 北京京东尚科信息技术有限公司 一种检测内存泄漏的方法和装置
CN107967205A (zh) * 2016-10-18 2018-04-27 广州市动景计算机科技有限公司 一种内存分析方法、装置、系统以及计算设备
CN107992429A (zh) * 2016-10-27 2018-05-04 腾讯科技(深圳)有限公司 一种内存对象引用关系确定方法及装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101599048A (zh) * 2009-07-01 2009-12-09 福建星网锐捷网络有限公司 一种内存监控的方法和装置
CN105302714A (zh) * 2014-07-24 2016-02-03 腾讯科技(深圳)有限公司 一种测试过程中内存泄漏的监控方法和装置
CN107967205A (zh) * 2016-10-18 2018-04-27 广州市动景计算机科技有限公司 一种内存分析方法、装置、系统以及计算设备
CN106484580A (zh) * 2016-10-21 2017-03-08 腾讯科技(深圳)有限公司 一种内存检测方法、装置及系统
CN107992429A (zh) * 2016-10-27 2018-05-04 腾讯科技(深圳)有限公司 一种内存对象引用关系确定方法及装置
CN107632929A (zh) * 2017-08-21 2018-01-26 北京京东尚科信息技术有限公司 一种检测内存泄漏的方法和装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
武安状主编.Android内存泄露问题.《使用Android系统测量软件开发技术》.2014,第480-482页. *

Also Published As

Publication number Publication date
CN109408383A (zh) 2019-03-01

Similar Documents

Publication Publication Date Title
CN109408383B (zh) 一种Java内存泄漏分析方法及装置
CN109240886B (zh) 异常处理方法、装置、计算机设备以及存储介质
US9323652B2 (en) Iterative bottleneck detector for executing applications
EP3432520B1 (en) Efficient storage and querying of time series metrics
US8990792B2 (en) Method for constructing dynamic call graph of application
CN108521339B (zh) 一种基于集群日志的反馈式节点故障处理方法及系统
CN106104496A (zh) 用于任意时序的不受监督的异常检测
US20160055044A1 (en) Fault analysis method, fault analysis system, and storage medium
CN111240876B (zh) 微服务的故障定位方法、装置、存储介质及终端
CN106777060B (zh) 节点式地震仪数据文件管理系统及方法
CN111078513A (zh) 日志处理方法、装置、设备、存储介质及日志告警系统
CN104050289A (zh) 一种异常事件检测方法及系统
CN103954277A (zh) 检测兴趣点位置的方法及装置
CN112528279A (zh) 一种入侵检测模型的建立方法和装置
CN114461534A (zh) 软件性能测试方法、系统、电子设备及可读存储介质
CN111090593A (zh) 确定崩溃归属的方法、装置、电子设备及存储介质
Pouchard et al. Prescriptive provenance for streaming analysis of workflows at scale
CN111159051A (zh) 死锁检测方法、装置、电子设备及可读存储介质
CN115510998A (zh) 交易异常值检测方法及装置
CN111368104A (zh) 信息处理方法、装置及设备
CN105302691A (zh) 一种元数据性能监控方法及系统
JP2012108708A (ja) 障害検知装置、情報処理方法、およびプログラム
CN112964286B (zh) 数据标记方法、温湿度记录仪及存储介质
CN112860469A (zh) 一种卡顿日志信息收集方法、装置、设备及存储介质
KR20150056268A (ko) 공장 운영 장애에 대한 분석용 어플리케이션 및 분석 방법

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant