CN112100022A - 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 - Google Patents
一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 Download PDFInfo
- Publication number
- CN112100022A CN112100022A CN202010818508.8A CN202010818508A CN112100022A CN 112100022 A CN112100022 A CN 112100022A CN 202010818508 A CN202010818508 A CN 202010818508A CN 112100022 A CN112100022 A CN 112100022A
- Authority
- CN
- China
- Prior art keywords
- java
- distribution
- bitmap
- leakage
- android system
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/3034—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a storage system, e.g. DASD based or network based
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/301—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system is a virtual computing platform, e.g. logically partitioned systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3051—Monitoring arrangements for monitoring the configuration of the computing system or of the computing system component, e.g. monitoring the presence of processing resources, peripherals, I/O links, software programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45591—Monitoring or debugging support
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法,属于计算机技术领域。本发明基于传统位图的思想,将对象分配点压缩聚类,在压缩位图中对Java堆上的每个对象用一个8bit数据来描述,第一个bit用来标识是否被访问过,后7bit用来记录对象的分配点颜色;在监测时,每间隔N次主GC触发一次泄漏推断,根据压缩位图判断对象是不是“冷”对象;当判定某对象泄漏时,输出与对象分配点相同颜色的分配点中相同对象类型的分配点与分配函数。本发明实现了一种在线的轻量级泄漏推断机制,并可提供与内存泄漏相关的分配点信息;相较于现有技术,本发明在运行时负载上表现更为良好。
Description
技术领域
本发明属于计算机技术领域,具体涉及一种安卓系统上Java对象内存泄漏时即时记录对象分配点的监测方法。
背景技术
在JAVA虚拟机中,垃圾回收机制一般采用基于引用计数或者基于可达性分析来回收不可到达对象的算法实现。自动垃圾回收机制在一定程度上减少了程序内存使用不当的错误,并且因为有具有统一的内存管理机制,相比手工分配提升了应用程序内存使用的效率,同时借由自动回收机制减少了因为丢失对象指针而造成的内存泄漏的问题。然而,自动垃圾回收机制并不能完全地避免内存泄漏的情况,JAVA对象往往在逻辑上有着有限的生命周期,当这些对象所要做的事情完成后,开发人员希望他们被回收掉。但是如果有一系列对象因为程序员疏忽在此时持有了这些“完成”工作的对象的引用,那么在逻辑上期待被收回的对象不会被回收的。在这种情况下它会持续占用内存直到所有被持有的引用释放,这就造成了一种隐式的内存泄漏。当这种情况持续发生时,应用申请的系统内存会很快被消耗殆尽甚至发生内存溢出错误。
ART(Android Runtime)虚拟机是Android系统在Linux底层之上构筑的虚拟机,Android中Java程序都运行在ART之中。同样,在Android中的JAVA程序也会出现内存泄漏的情况。根据对泄漏对象产生原因的分析,往往把泄漏的对象定义为“冷”对象:经过一段时间未被使用且未被垃圾回收机制回收的对象。开发人员一般情况下通过对象的“冷热”情况去判断受管理运行时系统中的内存的泄漏问题。Android系统往往运行在移动设备之上,这样的设备有着算力相对较低、带宽相对较小的特点,而现有的商业级监测工具不能满足所有场景下的用户监测内存泄漏的需求。
发明内容
本发明针对现有监测工具不能满足所有场景下的用户监测内存泄漏的需求的问题,提出了一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法,采用一种轻量级的监测机制去判断ART中对象的“冷热”情况,通过监测运行时中对象的活动行为,在线维护并判断对象的隐式的内存泄漏,从而找到“冷”对象分配点。对于分配点的说明:如对象A运行时在function()中被分配,本发明可定位到function(),称function()为对象A的分配函数,分配函数在虚拟机中的地址作为分配点。
本发明提供的安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法,包括:
(1)在Java堆对象分配时,记录Java对象的分配点和分配点分配的对象类型,将Java对象和分配点绑定存入压缩位图;所述的压缩位图用于记录Java对象是否被访问,以及保存对象分配点颜色,对一个Java对象用一个8bit数据来描述,第一个bit用来标识是否被访问过,后7bit用来记录对象的分配点颜色;
(2)在安卓系统中设置插桩代码,用于对每一次对象访问进行标记,并更新压缩位图中对应对象的第一个bit;
(3)在安卓系统的垃圾回收机制中,设置插桩代码,用于每间隔N次主GC触发一次泄漏推断;N为大于2的正整数;当触发泄漏推断时,在安卓系统中遍历Java堆上的每个活对象,根据压缩位图判断对象是不是“冷”对象;GC表示安卓系统中的垃圾回收;
(4)当对象判断是“冷”对象时,推断造成泄漏,设该对象的类型为C,对应的分配点颜色为B,则根据压缩位图,将其中所有颜色为B的分配点中分配C类型对象的分配点与分配函数输出。
所述的压缩位图中按Java堆中Java对象的存储顺序来存储Java对象的8bit数据。
在安卓系统的垃圾回收过程中,当Java对象被回收或移动时,更新维护所述的压缩位图;当Java对象被移动时,对应压缩位图中的8bit数据需要同时移动,当Java对象被回收时,从压缩位图中删除对应的8bit数据。
本发明的优点与积极效果在于:本发明提供了一种监测Java冷对象时的即时记录对象分配点的压缩机制,通过在线分析的方式,在低运行时负载与少量额外内存开销的情况下推断出内存泄漏,并提供相关信息帮助用户分析与内存泄漏相关的源代码。相较于现有其他Java对象内存泄漏监测的方案,本发明在运行时负载上表现更为良好。
附图说明
图1是本发明监测Java对象内存泄漏时即时记录对象分配点的监测机制示意图;
图2是Java对象的压缩位图的示意图;
图3是本发明进行Java对象内存泄漏监测的流程图。
具体实施方式
下面将结合附图和实施例对本发明作进一步的详细说明。
本发明基于传统位图的思想,将对象分配点压缩聚类,提供了一种分配点“染色”的思路。通过牺牲部分信息准确性,当判定某对象泄漏时,有概率会输出包括该对象分配点的一组分配点,达到了更低的运行时负载的效果。
如图1所示,本发明实现的安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法,是一种轻量级的监测机制,通过对Android系统中原有的垃圾回收机制进行改进,新增对象监测模块,查找“冷”对象来进行内存泄漏推断,图1中左侧虚框中为原有系统部分,右侧虚框为新增对象监测模块。本发明实施例结合Android10.0系统来进行说明。
图1中①表示“Android系统中原有的垃圾回收机制”。在Android10.0系统中前台垃圾回收(简称GC)根据情况不同,主要分为主GC和部分GC。安卓系统在所有GC过程中维护相关对象信息,详细维护内容在⑦中描述,在主GC中进行推断触发⑧,详细触发机制在②中描述。
图1中②表示“间隔触发机制”。本发明在原有安卓垃圾回收机制中间插桩代码,每间隔若干次主GC触发一次“泄漏推断”,测试间隔可由用户配置。根据“冷”对象定义:经过一段时间未被使用且未被垃圾回收机制回收的对象,则本发明实施例中,将认定间隔若干次主GC未被使用的活对象为怀疑泄漏的对象。
图1中③表示“触发推断机制”,经过②每间隔若干次主GC触发一次“泄漏推断”,在系统中开始遍历堆上的活对象。根据过程⑧,判断此次遍历对象的属性。得到的属性可能有两种:(1)在隔若干次主GC中被访问,则说明该对象不是“冷”对象。(2)在隔若干次主GC中未被访问,则说明该对象是“冷”对象。系统将根据④得到的信息,进行整理输出,触发机制⑨,比较对应“颜色”的分配点分配的对象类型和泄漏对象的类型,整理输出泄漏对象点可能的对象分配函数、对象大小、对象类型等有效信息。“颜色”在④中进行描述。
图1中④表示“记录观察对象”,可以根据用户配置,选择需要记录的对象大小阈值或对象种类,在记录过程中通过在Java堆对象分配的桩代码中获得对象分配点,并通过在编译过程中进行处理得到对象的分配函数,帮助后续在进行“冷”推断时,输出对象对应的分配函数。将分配点与对象绑定后存入⑦中进行动态维护与实时监测。如:对象A在分配点P点进行分配,P指A的分配函数在虚拟机中的地址。根据⑦中的定义每个对象地址对应8bit,通过hash函数H,定义H(P)%128为对象A的分配点P的“颜色”,将该“颜色”写入A对应的8bit中的后7bit,帮助在后续推断中判断分配点。同时需要维护维护各“颜色”的分配点分配的对象类型等信息方便后续信息整理。整个过程④“记录观察对象”记录了推断监测对象分配点所需的各种信息,并将“颜色”信息写入压缩位图。
图1中⑤表示“对象访问标记”。根据系统功能需求,该机制需要对每一次对象访问进行标记。设计中选择修改Android中的代码生成器,在执行诸如GetField,PutField,Invoke等指令时插桩代码,进行对应⑦压缩位图Access Bitmap的标记,以此标记做完判断对象是否在若干次主GC之中进行了访问。对象访问标记主要是修改压缩位图中对应对象的第一个bit的数值。
图1中⑥表示“维护对象移动和回收”。在GC的过程中,对象有可能被回收或移动,如果发生移动需要维护⑦“压缩位图”,如对象A从Address1移动到Address2,则位图上对应的8bit需要同时进行移动,以达到跟踪目标对象的目的。在对象回收时,Android10.0默认情况下按“区块”回收,本发明选择删除相应的监测对象的8bit数据,避免误报与空间浪费。
图1中⑦表示“压缩位图”,也就是标记位图,本发明在安卓系统采用压缩位图来保存Java对象访问信息与分配点“颜色”。如图2所示,标记位图Access Bitmap用来标记Java对象是否被访问,以及保存对象分配点颜色信息。例如,某个对象A,由分配点P分配,对象A的地址为O,堆的起始地址为H,压缩位图的起始地址为B,则压缩位图中用8bit数据来描述对象A是否被访问与分配点颜色,对象A的8bit的地址为:B+(O-H)/8。8bit数据中的第一个bit用来标识活跃信息,即是否被访问过,当该位值为0时,表示未被访问,当值为1时,表示曾经被访问,后7bit用来标识对象A的分配点颜色信息,通过哈希函数来计算颜色信息,设置对应A的分配点的颜色为Hash(P)%128。
图1中⑧表示在“泄漏对象推断”,由③触发推断机制,根据压缩位图进行泄漏对象推断。在本发明的安卓系统中,整个监测机制由③触发。监测的过程主要由⑨体现。在这个过程中扫描堆上全部监测的活对象,根据⑦“压缩位图”的对象的第一位标记来判断对象是否泄漏,如:对象A,对应8bit中第一位为0表示在若干时间内未被访问推断怀疑造成泄漏,触发机制⑨进行相关输出,对应8bit中第一位为1表示曾经被访问。
图1中⑨表示“进行相关输出”。在⑧得到的泄漏对象,根据对象类型与该对象颜色所保存的所有分配点进行比对输出。如:对象A泄漏,颜色为B,类型为C,则整理输出所有颜色为B的分配点中分配C类型对象的分配点。最终将整理的相关信息输出到文本,供用户选择上传至服务器或存档保留。
本发明的机制的主要运作过程如图3所示:垃圾回收开始之后,在GC移动和回收对象时维护对象相关信息,之后判断本次GC是否需要泄漏监测;如需要监测,扫描存活对象,根据标记位图判断对象“冷热”;最后将“冷”对象相关信息保存到本地。对于某个对象A,从标记位图中查找A对应的值,若对应位置为0,则代表是冷对象,若对应位置为1,则代表是热对象,继续对下一个对象A’进行判断。
Claims (5)
1.一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法,其特征在于,包括:
(1)在Java堆对象分配时,记录Java对象的分配点和分配点分配的对象类型,将Java对象和分配点绑定存入压缩位图;所述的压缩位图用于记录Java对象是否被访问,以及保存对象分配点颜色,对一个Java对象用一个8bit数据来描述,第一个bit用来标识是否被访问过,后7bit用来记录对象的分配点颜色;所述的分配点是指Java对象的分配函数在虚拟机中的地址;
(2)在安卓系统中设置插桩代码,用于对每一次对象访问进行标记,并更新压缩位图中对应对象的第一个bit;
(3)在安卓系统的垃圾回收机制中,设置插桩代码,用于每间隔N次主GC触发一次泄漏推断;N为大于2的正整数;当触发泄漏推断时,在安卓系统中遍历Java堆上的每个活对象,根据压缩位图判断对象是不是“冷”对象;GC表示安卓系统中的垃圾回收;
(4)当对象判断是“冷”对象时,推断造成泄漏,设该对象的类型为C,对应的分配点颜色为B,则根据压缩位图,将其中所有颜色为B的分配点中分配C类型对象的分配点,以及对应的分配函数输出。
2.根据权利要求1所述的方法,其特征在于,所述的(1)中,设Java对象A在分配点P分配,则对象A的分配点颜色采用哈希函数来计算得到,颜色为Hash(P)%128;其中,Hash()表示哈希函数。
3.根据权利要求1所述的方法,其特征在于,所述的(1)中,所述的压缩位图中按Java堆中Java对象的存储顺序来存储Java对象的8bit数据。
4.根据权利要求1所述的方法,其特征在于,所述的(1)中,设Java堆的起始地址为H,Java对象A的地址为O,压缩位图的起始地址为B,则对象A的8bit数据在压缩位图中的地址为B+(O-H)/8。
5.根据权利要求1或2所述的方法,其特征在于,所述的方法,在安卓系统的垃圾回收过程中,当Java对象被回收或移动时,更新维护所述的压缩位图,当Java对象被移动时,对应压缩位图中的8bit数据需要同时移动,当Java对象被回收时,从压缩位图中删除对应的8bit数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010818508.8A CN112100022B (zh) | 2020-08-14 | 2020-08-14 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010818508.8A CN112100022B (zh) | 2020-08-14 | 2020-08-14 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112100022A true CN112100022A (zh) | 2020-12-18 |
CN112100022B CN112100022B (zh) | 2022-02-15 |
Family
ID=73753849
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010818508.8A Active CN112100022B (zh) | 2020-08-14 | 2020-08-14 | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112100022B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11789845B2 (en) | 2021-10-15 | 2023-10-17 | International Business Machines Corporation | Software object identification using record generating code insertion |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101615143A (zh) * | 2008-06-27 | 2009-12-30 | 国际商业机器公司 | 用于内存泄漏诊断的方法和装置 |
CN101676906A (zh) * | 2008-09-18 | 2010-03-24 | 中兴通讯股份有限公司 | 一种利用位图对内存数据库空间进行管理的方法 |
CN101814049A (zh) * | 2010-03-23 | 2010-08-25 | 北京大学 | 一种内存泄漏探测方法 |
CN102289410A (zh) * | 2011-06-30 | 2011-12-21 | 杭州斯凯网络科技有限公司 | 基于mtk平台的内存分配状况监控方法 |
CN105808369A (zh) * | 2016-03-29 | 2016-07-27 | 北京系统工程研究所 | 一种基于符号执行的内存泄漏检测方法 |
US20200004653A1 (en) * | 2017-03-20 | 2020-01-02 | Netapp Inc. | Methods and systems for managing networked storage system resources |
-
2020
- 2020-08-14 CN CN202010818508.8A patent/CN112100022B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101615143A (zh) * | 2008-06-27 | 2009-12-30 | 国际商业机器公司 | 用于内存泄漏诊断的方法和装置 |
CN101676906A (zh) * | 2008-09-18 | 2010-03-24 | 中兴通讯股份有限公司 | 一种利用位图对内存数据库空间进行管理的方法 |
CN101814049A (zh) * | 2010-03-23 | 2010-08-25 | 北京大学 | 一种内存泄漏探测方法 |
CN102289410A (zh) * | 2011-06-30 | 2011-12-21 | 杭州斯凯网络科技有限公司 | 基于mtk平台的内存分配状况监控方法 |
CN105808369A (zh) * | 2016-03-29 | 2016-07-27 | 北京系统工程研究所 | 一种基于符号执行的内存泄漏检测方法 |
US20200004653A1 (en) * | 2017-03-20 | 2020-01-02 | Netapp Inc. | Methods and systems for managing networked storage system resources |
Non-Patent Citations (1)
Title |
---|
李褚乔: "基于Android的内存泄露检测方法研究", 《CNKI》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11789845B2 (en) | 2021-10-15 | 2023-10-17 | International Business Machines Corporation | Software object identification using record generating code insertion |
Also Published As
Publication number | Publication date |
---|---|
CN112100022B (zh) | 2022-02-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9836362B2 (en) | Cyclic commit transaction protocol | |
Lengauer et al. | Accurate and efficient object tracing for java applications | |
US6523141B1 (en) | Method and apparatus for post-mortem kernel memory leak detection | |
US20100031238A1 (en) | Method and Apparatus for Locating Memory Leak in a Program | |
US20070271418A1 (en) | Resource leak diagnosis | |
CN105868122A (zh) | 快闪存储设备的数据处理方法及装置 | |
US20170351606A1 (en) | Persistent memory garbage collection | |
Harris | Dynamic adaptive pre-tenuring | |
WO1999000733A1 (en) | Method and apparatus for managing hashed objects | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
US8478738B2 (en) | Object deallocation system and method | |
CN109992476A (zh) | 一种日志的分析方法、服务器及存储介质 | |
US20090300085A1 (en) | Overflow per segment | |
CN112100022B (zh) | 一种安卓系统上监测Java对象内存泄漏时即时记录对象分配点的方法 | |
US20070180002A1 (en) | Method and apparatus for reducing object pre-tenuring overhead in a generational garbage collector | |
CN108446224B (zh) | 移动端上应用程序的性能分析方法、存储介质 | |
CN103927305A (zh) | 一种对内存溢出进行控制的方法和设备 | |
Andrzejak et al. | Detection of memory leaks in C/C++ code via machine learning | |
US8176286B2 (en) | Memory recycling in computer systems | |
CN112783835A (zh) | 索引管理方法、装置及电子设备 | |
Borg et al. | Real-time memory management: Life and times | |
US7606989B1 (en) | Method and apparatus for dynamically pre-tenuring objects in a generational garbage collection system | |
US20180150405A1 (en) | Data type management | |
CN113836051B (zh) | 一种元数据空间回收方法、装置、设备及存储介质 | |
CN113360274A (zh) | 垃圾回收方法、装置及计算设备 |
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 |