CN117009118A - 一种内存处理方法、装置、设备、介质及程序产品 - Google Patents

一种内存处理方法、装置、设备、介质及程序产品 Download PDF

Info

Publication number
CN117009118A
CN117009118A CN202211276708.0A CN202211276708A CN117009118A CN 117009118 A CN117009118 A CN 117009118A CN 202211276708 A CN202211276708 A CN 202211276708A CN 117009118 A CN117009118 A CN 117009118A
Authority
CN
China
Prior art keywords
memory
node
attribute
edge
target
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.)
Pending
Application number
CN202211276708.0A
Other languages
English (en)
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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202211276708.0A priority Critical patent/CN117009118A/zh
Publication of CN117009118A publication Critical patent/CN117009118A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/073Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a memory management context, e.g. virtual memory or cache management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • 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)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请实施例公开了一种内存处理方法、装置、设备、介质及程序产品,其中的方法包括:获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据;根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系;基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点;根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量。采用本申请实施例能够快速计算各内存节点的可回收内存量,从而较为迅速地定位存在内存泄露的位置。

Description

一种内存处理方法、装置、设备、介质及程序产品
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存处理方法、一种内存处理装置、一种计算机设备、一种计算机可读存储介质及一种计算机程序产品。
背景技术
内存泄露(Memory Leak)是指程序(如服务器程序或客户端程序等)中已动态分配的堆内存由于某种原因程序未释放或无法释放;当计算机设备存在内存泄露问题时,很可能导致其他正在运行的程序无法申请到内存,影响计算机设备的运行效率和速度。
因此,如何快速检测计算机设备中的内存泄露问题,成为内存泄露领域的热点研究。
发明内容
本申请实施例提供一种内存处理方法、装置、设备、介质及程序产品,能够直接分析内存快照文件,快速计算各内存节点的可回收内存量,从而较为迅速地定位存在内存泄露的位置。
一方面,本申请实施例提供了一种内存处理方法,该方法包括:
获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据,描述数据包括:内存空间划分得到的各内存节点的节点属性,以及连接各内存节点的各连边的边属性;
根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系;
基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点;
根据目标内存节点,以及与根内存节点存在不可达关系的参考内存节点,计算目标内存节点的可回收内存量,可回收内存量用于表征:目标内存节点被释放后能够被回收的内存量。
另一方面,本申请实施例提供了一种内存处理装置,该装置包括:
获取单元,用于获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据,描述数据包括:内存空间划分得到的各内存节点的节点属性,以及连接各内存节点的各连边的边属性;
处理单元,用于根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系;
处理单元,还用于基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点;
处理单元,还用于根据目标内存节点,以及与根内存节点存在不可达关系的参考内存节点,计算目标内存节点的可回收内存量,可回收内存量用于表征:目标内存节点被释放后能够被回收的内存量。
在一种实现方式中,任一内存节点的节点属性包括边持有属性,边持有属性用于表征:以任一内存节点作为父内存节点时,任一内存节点所关联的连边;连边是有向边,任一连边的边属性包括边指向属性,边指向属性用于表征任一连边所指向的子内存节点;
处理单元,用于根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系时,具体用于:
根据各内存节点的边持有属性的属性值,确定各连边所关联的父内存节点;以及,
基于各连边的边指向属性的属性值,确定各连边所指向的子内存节点;
根据每个连边所关联的父内存节点和所指向的子内存节点,构建内存空间的内存图;内存图是采用各连边连接各内存节点所得到的有向图,内存图可用于表示内存空间包括的各内存节点之间的连接关系。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是根内存节点,则与根内存节点存在不可达关系的参考内存节点包括:内存图中除根内存节点之外的全部内存节点;
处理单元,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将根内存节点的节点内存量的内存量数值,与内存图中除根内存节点之外的全部内存节点的节点内存量的内存量数值相加,得到第一相加内存量;
将第一相加内存量,作为根内存节点的可回收内存量。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是内存图中的末端内存节点,末端内存节点是内存图中不作为连边关联的父内存节点的内存节点,则不存在与根内存节点之间具有不可达关系的参考内存节点;
处理单元,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将目标内存节点的节点内存量的内存量数值,作为目标内存节点的可回收内存量。
在一种实现方式中,目标内存节点是内存图中,除根内存节点和末端内存节点之外的任一内存节点;末端内存节点是内存图中不作为连边关联的父内存节点的内存节点;
处理单元,用于从内存图中确定与根内存节点存在不可达关系的参考内存节点时,具体用于:
从内存图中移除目标内存节点,得到更新后的内存图;
将更新后的内存图中的根内存节点作为起始点,沿着连边遍历更新后的内存图中的各内存节点;
将更新后的内存图中未遍历到的内存节点,作为与根内存节点存在不可达关系的参考内存节点。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;处理单元,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将目标内存节点的节点内存量的内存量数值,与参考内存节点的节点内存量的内存量数值,得到第二相加内存量;
将第二相加内存量,作为目标内存节点的可回收内存量。
在一种实现方式中,若内存图中存在弱引用属性类型的连边,则处理单元,还用于:
在沿着连边遍历更新后的内存图中的各内存节点的过程中,不沿着弱引用属性类型的连边遍历内存图中的内存节点。
在一种实现方式中,描述数据还包括节点属性的节点属性类型,以及各连边的边类型;内存快照文件中包括节点属性字段、节点属性类型字段、边属性字段以及边类型字段;处理单元,用于对内存快照文件进行分析处理,得到内存空间的描述数据时,具体用于:
对节点属性字段进行属性分析,得到内存空间中各内存节点的节点属性,并对节点属性类型字段进行属性类型分析,得到节点属性的属性类型;
以及,对边属性字段进行属性分析,得到连接各内存节点的连边的边属性,并对边类型字段进行类型分析,得到连边的边类型;
其中,节点属性包括以下至少一个:节点类型、节点标识、节点编号、节点内存量、边持有属性以及节点的内存指示标识,边持有属性用于指示以内存节点作为父内存节点的连边数量;边属性包括以下至少一个:边类型、边标识以及边指向属性,边指向属性用于指示连边所指向的子内存节点。
在一种实现方式中,描述数据还包括内存节点的节点属性的属性值,以及连边的边属性的属性值;内存快照文件中还包括属性值数组和数据查询数组,属性值数组中包括目标属性的属性值,数据查询数组中包括目标属性的查询标识,目标属性是节点属性或边属性;处理单元,还用于:
从数据查询数组中确定目标属性关联的查询标识;
基于目标属性关联的查询标识生成目标属性的索引值;
按照目标属性的索引值,从属性值数组中确定目标属性的属性值。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;处理单元,还用于:
比较目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量,得到内存量比较结果;
若内存量比较结果满足内存泄露条件,则将目标内存节点作为存在内存泄露的泄露内存节点;
其中,内存泄露条件包括:目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量之间的内存量差距,大于内存量阈值。
在一种实现方式中,处理单元,还用于:
输出节点关系图,节点关系图是基于各内存节点的连接关系,采用各连边将各内存节点进行连接得到的有向图;
在节点关系图中视觉突出显示一个或多个泄露内存节点。
在一种实现方式中,处理单元,还用于:
当节点关系图中的任一内存节点被触发时,显示任一内存节点的节点信息;
其中,内存节点的节点信息包括以下至少一个:节点标识,节点编号,节点内存量,节点作为父内存节点时关联的子内存节点,节点作为子内存节点时关联的父内存节点,以及可回收内存量。
另一方面,本申请实施例提供了一种计算机设备,该设备包括:
处理器,用于加载并执行计算机程序;
计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,该计算机程序被处理器执行时,实现上述内存处理方法。
另一方面,本申请实施例提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,该计算机程序适于由处理器加载并执行上述内存处理方法。
另一方面,本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,计算机指令被处理器执行时实现上述的内存处理方法。
本申请实施例支持获取内存空间的内存快照文件,并直接对内存快照文件进行分析处理,得到内存空间的描述数据,该描述数据可包括各内存节点的节点属性和连接各内存节点的各连边的边属性;这样可以基于各内存节点的节点属性和连接各内存节点的连边的边属性,确定各内存节点之间的连接关系;再基于连接关系从各内存空间中确定根内存节点,与根内存节点具有可达关系的目标内存节点,以及与根内存节点具有不可达关系的参考内存节点;从而根据目标内存节点以及参考内存节点,计算得到目标内存节点的可回收内存量。上述方案中,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量,从而帮助开发对象迅速定位存在内存泄露的内存节点。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个示例性实施例提供的一种内存处理方案的整体流程图;
图2是本申请一个示例性实施例提供的一种生成Wasm文件的示意图;
图3是本申请一个示例性实施例提供的一种内存处理方法的流程示意图;
图4a是本申请一个示例性实施例提供的一种获取内存快照文件的示意图;
图4b是本申请一个示例性实施例提供的另一种获取内存快照文件的示意图;
图5是本申请一个示例性实施例提供的一种各内存节点之间的连接关系的示意图;
图6是本申请一个示例性实施例提供的一种各内存节点和连边之间的对应的示意图;
图7a是本申请一个示例性实施例提供的一种计算目标内存节点的可回收内存量的示意图;
图7b是本申请一个示例性实施例提供的一种目标内存节点为根内存节点时,计算根内存节点的可回收内存量的示意图;
图7c是本申请一个示例性实施例提供的一种目标内存节点为末端内存节点时,计算末端内存节点的可回收内存量的示意图;
图7d是本申请一个示例性实施例提供的一种目标内存节点为中间内存节点时,计算中间内存节点的可回收内存量的示意图;
图8是本申请一个示例性实施例提供的另一种内存处理方法的流程示意图;
图9是本申请一个示例性实施例提供的一种节点关系图的示意图;
图10是本申请一个示例性实施例提供的一种在节点关系图中视觉突出显示泄露内存节点的示意图;
图11是本申请一个示例性实施例提供的一种在节点关系图中查看任一内存节点的节点信息的示意图;
图12是本申请一个示例性实施例提供的一种内存处理装置的结构示意图;
图13是本申请一个示例性实施例提供的一种计算机设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
下面先对本申请实施例涉及的技术术语和相关概念进行简单介绍,其中:
(1)内存空间(Memory Space)。
内存空间也称为可执行存储器或存储空间等。计算机设备中部署有内存空间;内存空间可用于存放计算机设备中部署的装置(如图形处理器(Graphics Processing Unit,GPU)和中央处理器(Central Processing Unit,CPU))运行的数据,以及与外部内存空间(是相对于计算机设备内置的内存空间而言的)交换的数据,等等。
考虑到CPU对不同内存单元的访问时间可能不同,支持采用内存节点来描述内存空间,具体是将CPU划分为多个内存节点(node),且将内存空间划分为多个内存簇(bank);由于每个CPU对应一个内存空间,则可以认为一个内存节点对应一个内存簇(bank),每个内存节点关联到系统中的一个处理器,系统中每个内存节点被链接到链表中,以根据链表得到各内存节点的连接关系,这样链表中的每个内存节点可用于表示程序中的一个或多个对象的执行位置。
计算机编程语言JavaScript(或简称为JS,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,作为开发网页页面的脚本语言)的内存生命周期可包括:分配程序所需的内存空间→使用分配的内存空间(如读写内存空间中的数据)→不需要时释放或归还内存空间。其中:①内存生命周期中的第一步“分配程序所需的内存空间”是指,为程序分配运行所需的内存空间;在J avaScript定义程序的变量时就完成了为变量(或程序)分配内存空间的操作。②内存生命周期中的第二步“使用分配的内存空间”是指,在运行程序时可在已为程序分配的内存空间中进行数据的读写操作(包括读取操作和写入操作);在运行程序时可自动根据已分配的内存空间的地址,使用内存空间。③内存生命周期中的第三步“不需要时释放(或归还,回收)内存空间”是指,检测不再继续使用的变量或数据,然后释放其占用的内存空间;内存空间的回收往往是依赖于垃圾回收机制自动执行的,垃圾回收机制(或称为垃圾回收器)提供一种对内存空间回收的机制,支持在内存空间空闲或者内存空间占用(如使用率)过高的时候,对那些没有任何引用的对象不定时地进行回收。由此上述对内存生命周期的相关描述可知,内存空间的回收对计算机设备的运行速度和效率有着至关重要的作用。
(2)内存泄露(Memory Leak)。
如前述描述的内存生命周期可知,在内存生命周期中包括内存空间回收的步骤,通过自动回收不再使用的内存空间,能够确保计算机设备中运行的其他程序能申请到内存空间,从而维持计算机设备的正常运行。然而,可能由于某种原因导致内存生命周期的内存空间回收不能正常执行,此时确定存在内存泄露;也就是说,内存泄露可是指:在为程序(如某个应用或服务等)动态分配内存空间后,由于某种原因程序未能或不能释放已分配的内存空间。
需注意的是,本申请实施例提及的内存空间可是指计算机设备(如服务器)为程序动态分配的堆内存,堆内存是一个连续的内存空间(或称为内存区域);支持将共享数据或交换信息等存放在堆内存中,这样当多个程序同时运行时,通过该堆内存中可实现共享数据或信息。当然,内存空间还可以是计算机设备的主存储器空间(物理地址空间),为便于阐述,本申请实施例以内存空间是为应用程序分配的堆内存为例进行阐述,在此说明。
在实际应用中,随着计算机应用需求的日益增加,如服务器所需运行的应用程序的种类和数量愈来愈多,导致计算机设备需处理的变量或数据也大量增加。例如,服务器需要长时间运行应用程序,不断处理由客户端发来的处理请求,使得服务器处理的变量和数据繁多,那么如果不能有效进行内存空间的管理,会导致每处理一次处理请求就可能产生的内存泄漏。考虑到前端开发对象往往缺乏服务端编程知识,特别是在使用Node.js遇到内存泄露的问题时,将会很难排查到内存泄露的位置;从而导致不再使用的内存空间不能及时释放,很可能导致计算机设备中正在运行的其他程序无法使用再申请到内存空间,从而造成内存浪费,不仅影响到服务器的运行性能,还可能造成整个系统的崩溃。其中,Node.js是基于Chrome V8引擎的JavaScript运行环境,使用了事件驱动以及非阻塞式I/O的模型,使其轻量又高效。V8由Google(谷歌)开发的开源JavaScript引擎,可用于谷歌浏览器及Chromium的运行引擎,也是Node.js的运行引擎。
基于此,本申请实施例提供了一种内存处理方案,该内存处理方案支持对内存空间的内存快照文件(或简称为内存快照)直接进行分析,以快速获取有用信息,帮助开发对象迅速定位服务端程序所存在的内存泄露问题。所谓内存空间的内存快照可是指,在目标时刻(如任一时刻)将内存空间中的全量数据记录下来,以文件的形式保存在硬盘上;有了内存空间的内存快照后,即使计算机设备发生宕机等问题,内存空间在目标时刻的全量数据,依然可以通过内存快照恢复得到。其中,在内存空间为堆内存的情况下,内存空间的内存快照可简称为堆快照,本申请实施例对此不作限定。
本申请实施例提供的内存处理方案可参见图1,如图1所示,内存处理方案的流程大致可包括:首先,获取内存空间的内存快照文件,该内存快照文件是无法阅读的,因此需要对内存快照文件进行分析处理,以将其格式化为可读性较强的结构;此处对内存快照文件的分析处理可包括分析内存空间包括的一个或多个内存节点(如内存节点的节点属性)和连接各内存节点的各连边(如连边的边属性)。然后,根据分析结果将无法阅读的内存快照序列化为可读性较好的JSON(JavaScript Object Notation)结构,JSON是前述提及的JavaScrip的数据交换格式,帮助更好地进行内存节点之间的关系分析。其次,基于可读性较好的JSON结构中表述的各内存节点之间的连接关系,计算每个内存节点的可回收内存量(retained_size),该可回收内存量用于表征:目标内存节点被释放后能够被垃圾回收机制所回收的内存大小(或称为内存量)。最后,基于每个内存节点的可回收内存量和自身的节点内存量,从内存空间所包含的一个或多个内存节点中找到存在内存泄露的泄露内存节点,这样可主动释放泄露内存节点,解决内存泄露问题,达到高效地内存回收效果。
本申请实施例提供的内存处理方案,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量,帮助开发对象迅速定位存在内存泄露的内存节点。
基于上述对本申请实施例提供的内存处理方案的简单描述,有如下几点值得说明:
①为提升内存泄露的检测速度,本申请实施例支持采用目标编程语言来编写内存处理方案的分析逻辑的代码,以获得高性能的分析性能,如目标编程语言为Rust语言,Rust语言是一种通用的编译型编程语言,遵循“安全、并发、实用”等设计准则,支持函数式、并行式、过程式以及面向对象的程序设计风格,这样采用Rust语言代替js语言来提升计算速度,获得较高的分析性能。进一步的,考虑到目前浏览器并不支持运行采用rust语言编码的代码,因此,在采用Rust编写得到内存处理方案的目标代码后,还需采用编译工具将采用rust语言编码的代码,编译为允许在浏览器中运行的Wasm文件,这样在浏览器中可通过调用Wasm文件实现本申请实施例提供的内存处理方案,提升分析性能;上述生成wasn文件的示例性过程可参见图2。其中,编译工具可包括Webasse mbly,是应用于浏览器内的客户端,是便携式的抽象语法树,被设计来提供比J avaScript更快速的编译及执行;WebAssembly让开发对象能够运用自己熟悉的编程语言(如rust语言或c语言等)编译,再为虚拟机引擎在浏览器内执行,实现高效的编译。
②本申请实施例用于执行内存处理方案的计算机设备可包括服务器;如浏览器对应的后台服务器,通过在浏览器中调用上述提及的wasm文件,以触发服务器执行本申请实施例提供的内存处理方案。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器;本申请实施例对服务器的具体类型不作限定。
基于上述描述的内存处理方案,本申请实施例提出更为详细的内存处理方法,下面将结合附图对本申请实施例提出的内存处理方法进行详细介绍。
图3示出了本申请一个示例性实施例提供的一种内存处理方法的流程示意图;该内存处理方法可以由上述提及的计算机设备来执行,该内存处理方法可包括但不限于步骤S301-S304:
S301、获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据。
具体实现中,在开发对象具有检测内存空间中存在内存泄露的位置的需求时,可获取目标时刻内存空间中的内存快照文件,此处的目标时刻可是指开发对象想要确定内存空间中存在的内存泄露的时刻,往往是开发对象触发获取内存快照文件的时刻;并通过调用浏览器中的Wasm文件对内存快照文件进行分析处理,以获得内存空间在目标时刻的描述数据。其中,开发对象可能在确定系统运行速度慢,内存占用率高或系统卡顿等情况下,产生分析内存泄露的位置的需求;本申请实施例对开发对象产生分析内存泄露的位置的具体需求不作限制。
正如前述所描述的,本申请实施例是采用Rust语言来编写内存处理方案的分析逻辑的代码的,因此可使用Rust来调用V8运行引擎的接口,获取的内存空间的内存快照文件。其中,Rust调用V8运行引擎的代码片段如下:
Pub unsafe fn get_current()->0wnedIsolate{
0wnedIsolate::new(v8__Isolate__GetCurrent())
}
在实际应用中,本申请实施例对内存空间的内存快照文件的获取方式不作限定,下面结合附图给出两种示例性的内存空间的内存快照文件的获取方式,其中:
(1)计算机设备支持接收开发对象发送的内存空间的内存快照文件,并基于接收到的内存快照文件执行后续的内存处理方案。换句话说,内存空间的内存快照文件可以是开发对象在任一时刻获取到的;当开发对象具有定位在该任一时刻时内存空间中存在内存泄露的位置时,开发对象可将该内存快照文件作为Wasm文件的输入,以实现计算机设备获取到内存快照文件。这种内存快照文件的获取方式,能确保每次分析的内存快照文件均是开发对象所需分析的内存快照文件,满足开发对象针对性分析内存泄露的需求。
如图4a所示,假设开发对象所使用的计算机设备401,和部署有内存处理方案的分析逻辑(或存储有Wasm文件)的计算机设备402属于不同的设备;此实现方式下,在开发对象具有分析内存泄露的位置的需求时,开发对象可通过计算机设备401将内存快照文件发送至计算机设备402中,以便于计算机设备402执行后续内存分析的步骤。当然,开发对象所使用的计算机设备401,与部署有内存处理方案的分析逻辑(或存储有Wasm文件)的计算机设备402,也可以是同一设备;此实现方式下,计算机设备可直接在内存中调用存储的内存快照文件,以获取到内存空间的内存快照文件。
(2)计算机设备自动进行内存空间的内存快照文件的生成,并基于生成的内存快照文件执行后续的内存处理方案。也就是说,本申请实施例支持计算机设备在检测到可能存在内存泄露的情况下,自动生成内存空间的内存快照文件,以实现获取到内存空间的内存快照文件;例如,计算机设备检测到系统卡顿持续时长大于时长阈值时,可自定生成内存快照的内存快照文件,此处的时长阈值可以是开发对象根据业务需求自定义的,或者计算机设备根据经验产生的。再如,计算机设备可以定时生成内存空间的内存快照文件,如计算机设备每间隔目标时间段,生成内存空间相应的内存快照文件,此处的目标时间段可以是开发对象根据业务需求事先设定的。这种内存快照文件的获取方式,无需开发对象额外执行内存快照文件的获取操作,在减少开发对象的工作量的同时,还能实时监测内存运行情况,提高内存泄露分析的及时性。
如图4b所示,假设计算机设备每隔目标时间段自动执行,获取当前时刻下内存空间的内存快照文件,目标时间段为1小时,且在早上7:00生成了7:00时刻下的内存快照的内存快照文件后,在早上8:00可再生成8:00时刻下的内存快照的内存快照文件。然后,可根据业务需求对每个时刻或任一个或多个时刻下生成的内存空间的内存快照文件进行后续的分析处理。
需要说明的是,上述只是本申请实施例给出的两种示例性的内存快照文件的获取方式;在实际应用中,获取内存空间的内存快照文件的具体实施过程还可以发生变化,对此不作限定。
进一步的,计算机设备获取到的内存快照文件(或称为heapdump文件,基于heapdump工具来保存的)是无法阅读的,因此计算机设备在获取到内存快照文件后,还需将内存快照文件格式化为可读性较好的结构,以便于执行后续操作。具体实现中,计算机设备获取内存空间的内存快照文件后,对内存快照文件进行分析处理,得到内存空间的描述数据;具体是通过阅读V8运行引擎的源码,先梳理出内存快照文件的定义规范,再根据定义规范对内存快照文件进行分析处理,得到内存空间的描述数据。
考虑到对象在内存空间中的拓扑结构需要使用图型数据结构(如Graph数据结构)来表示,因此分析得到的内存空间的描述数据可包括但不限于:内存空间划分得到的各内存节点(node)的节点属性和节点属性的属性类型,以及连接各内存节点的各连边(edge)的边属性。在实际应用中,内存快照文件中包括各内存节点的节点属性字段和节点属性类型资源,以及各连边的边属性字段和边属性类型字段。这样可对内存节点的节点属性字段进行属性分析,得到内存节点中各内存节点的节点属性,同理,对内存节点的节点属性类型字段进行属性类型分析,得到节点属性的属性类型;以及,对各连边的边属性字段进行属性分析,得到连接各内存节点的连边的边属性,以及,对各内存节点的边属性类型字段进行属性类型分析,得到边属性的属性类型。下面对上述给出的各字段进行介绍。
1)关于内存节点的节点属性字段和节点属性类型字段。
内存节点的节点属性定义在节点属性字段node_fields中,具体是{“snapshot”:{“meta”:{“node_fields”:[“type”,“name”,“id”,“self_size”,“edge_count”,“trace_node_id”],该节点属性字段定义了内存节点拥有的属性列表。由此定义可知,内存节点的节点属性一共可包括6个,任一内存节点的节点属性可包括以下至少一个:节点类型type、节点标识name、节点编号id、节点内存量self_size、边持有属性edge_count以及节点的内存指示标识trace_node_id。其中,节点属性“节点类型”可用于指示内存节点所属的节点类型;节点属性“节点标识”和节点属性“节点编号”可用于唯一标识内存节点的身份;节点属性“节点内存量”用于指示内存节点本身所包含的内存大小;节点属性“边持有属性”可用于指示以内存节点作为父内存节点的连边数量,即内存节点所拥有的连边的数量;节点属性“节点的内存指示标识”可用于指示内存节点在浏览器中对应的内存地址(如为空占位符)。
内存节点的每个节点属性的拥有固定的节点属性类型,节点属性类型定义在节点属性类型字段node_types中,具体是:“node_types”:[[“hidden”,“array”,“string”,“object”,“code”,“closure”,“regexp”,“number”,“native”,“synthetic”,“concatenated string”,“sliced string”,“symbol”,“bigint”],“string”,“number”,“number”,“number”,“number”,“number”],该节点属性类型字段定义了节点属性一共有14个节点属性类型,以及内存节点一共有2个节点类型(如数组类型和数字类型)。其中,14个节点属性类型可包括:布尔类型hidden,数据类型array,引用类型string,对象类型object,程序类型code,函数类型closure,引用类型regexp,数字类型number,基础数据类型native,合成数据类型synthetic,函数拼接类型concatenated string等等。
2)关于内存节点的节点属性字段和节点属性类型字段。
连边的边属性定义在边属性字段edge_fields中,该edge_fields字段中定义的边属性可包括:边类型、边标识以及边指向属性;边属性“边类型”可用于指示连边所属的边类型,边属性“边标识”可用于唯一标识连边的身份,边属性“边指向属性”可用于指示连边所指向的子内存节点,即与连边包含箭头一端相邻的内存节点。
连接各内存节点的各个连边也具有不同的边类型,边类型可定义在边类型字段edge_types中,具体是:“edge_types”:[“contex”,“element”,“property”,“internal”,“hidden”,“shortcut”,“weak”],该边类型字段定义了连边一共有7种边类型属性,分别为:函数属性contex,数组属性element,对象属性property,无法被访问的内部属性internal,对用户不可见的属性hidden,计算大小时忽略的属性shortcut,弱引用属性weak。
需要说明的是,基于上述描述,可得到内存空间包括的一个或多个内存节点中的每一个内存节点具有的节点属性和节点属性类型,以及连接(或链接)各内存节点的连边所具有的边属性和边类型。本申请实施例对上述提及的内存节点的节点属性和连边的边属性的具体属性不作限定,同理,对内存节点的节点属性类型以及连边的边类型的具体类型不作限定;并且,对任一个内存节点所包含的节点属性的节点属性类型的数量也不做限定。
还需说明的是,内存空间的描述数据除包括上述提及的,内存节点的节点属性和节点属性类型,以及连边的边属性和边类型外,还可以包括内存节点的节点属性的属性值,以及连边的边属性的属性值。例如。内存节点的节点属性“节点内存量”的属性值为该内存节点的具体内存大小;再如。内存节点的节点属性“节点标识”的属性值可以为该内存节点的具体名称。
出于内存空间使用的考虑,生成的内存快照文件中并不会直接记录内存节点的节点属性的属性值,以及连边的边属性的属性值,而是存储一连串数字(或称为数字串)。为便于阐述,采用目标属性来表示内存节点的一个节点属性,或连边的一个边属性进行描述,即目标属性是节点属性或边属性。例如,目标属性是节点属性时,可采用一连串数字代表内存节点的各个节点属性,将这一连串数字存储在内存快照文件中,再通过目标属性在一连串数字中的顺序作为索引,去关联该目标属性的属性值。上述提及的一连串数字中的任一数字可称为相应属性的查询标识(或称为查询下标);正如前述所描述的,内存节点的节点属性可包括6个,按序排列为:节点类型、节点标识、节点编号、节点内存量、边持有属性以及节点的内存指示标识,则可采用数字串:9,1,1,1,8,0分别代表节点属性“节点类型,节点标识,节点编号,节点内存量,边持有属性,节点的内存指示标识”,此时可将数字9称为节点属性“节点类型”的查询下标,将数字1称为节点属性“节点标识”的查询下标,等等。
具体实现中,内存快照文件中还包括属性值数组和数据查询数组。根据目标属性是内存节点的节点属性或连边的边属性的不同,属性值数组和数据查询数组所包含的内容也不相同。例如,目标属性是内存节点的节点属性时,属性值数组可用于存储各内存节点的每个内存属性的属性值,具体是该属性值数组中包括目标属性的属性值;数据查询数组可用于存储各内存节点的每个内存属性的查询标识,具体是该数据查询数组中包括目标属性的查询标识。下面以查询目标属性的属性值为例,对获取目标属性的属性值的具体实施过程进行介绍,具体可包括步骤s11-s13:
s11:从数据查询数组中确定目标属性关联的查询标识。以数据查询数组为内存节点的查询数组,内存空间中包括8个内存节点为例,由前述描述可知内存节点的节点属性包括3个,分别为:节点类型、节点标识、节点编号、节点内存量、边持有属性t以及节点的内存指示标识,则内存节点的数据查询数组可表示为:
“nodes”:[9,1,1,0,8,0
,9,2,3,0,23,0
,9,3,5,0,1,0
,9,4,7,0,79,0
,9,5,9,5,555,0
,9,6,11,0,75,0
,9,7,13,0,0,0
,9,8,15,0,0,0]
由此可见,内存节点的节点属性的数据查询数组nodes是一个一维数组,每行代表内存空间中的一个内存节点,具体是代表内存节点的6个节点属性的属性值在属性值数组中的查询标识。例如,nodes数组中的第一行数字串为9,1,1,0,8,0,表示内存空间中的内存节点1的节点属性“节点类型”的属性值在在属性值数组中的查询标识为9,节点属性“节点标识”的属性值在在属性值数组中的查询标识为1,节点属性“节点编号”的属性值在在属性值数组中的查询标识为1,等等。基于此,根据目标属性属于哪个内存节点,可从数据查询数组中查询到该目标属性关联的查询标识,所谓目标属性关联的查询标识是指目标属性的属性值在属性值数组中的查询标识。
同理,以数据查询数组为连边的查询数组,连边的数量为8为例,由前述描述可知连边的边属性包括3个,分别为:边类型、边标识以及边指向属性,则连边的数据查询数组可表示为:
“edges”:[1,1,6
,5,5742,13332
,1,3,174438
,1,4,174444
,1,5,174450
,1,6,174456
,1,7,174462
,1,8,174468]
与上述描述的节点属性的数据查询数组类似的,连边的边属性的数据查询数组edges是一个一维数组,每行代表一个连边,具体是代表连边的3个边属性的属性值在属性值数组中的查询标识;根据数据查询数组edges记录边属性的属性值的查询下标,可以查到每一个边属性在属性值数组的位置,从而得到边属性的属性值,在此不作赘述。
可以理解的是,上述给出的数据查询数组(如数据查询数组所包含的数字)只是示例性的,本申请实施例对此不作限制。
s12:基于目标属性关联的查询标识生成目标属性的索引值。具体是根据目标属性关联的查询标识,以及该查询标识在数据查询数组所在行的顺序,生成目标属性的索引值;根据该索引值可在属性值数组中查询到该目标属性的属性值。其中,索引值的计算公式为:查询标识*列数+查询标识在当前行的偏移值。
举例来说,假设目标属性为内存节点1的节点类型,由前述给出的数据查询数组可得到该目标属性关联的查询标识为9,且该查询标识位于数据查询数组中的第一行的第一列,则根据索引值的计算公式可得到该目标属性关联的索引值为:9*1+0=9。
s13:按照目标属性的索引值,从属性值数组中确定目标属性的属性值。其中,内存节点的属性值数组可表示为:
“strings”:[“<dummy>,
“”,
“(GC roots)”,
“(Internalized strings)”,
“(External strings)”,
“(Read-only roots)”,
“(Strong roots)”,
“(smi roots)”,
“(Bootstrapper)”,
“(Isolate)”,
“(Relocatable)”,
“(Debugger)”,
…]
由此可见,属性值数组strings中包括多个属性值,根据步骤s12确定的目标属性的索引值,可从属性值数组strings中确定出目标属性的属性值;具体需要参考目标属性的属性类型以及目标属性的索引值,一同从属性值数组strings中确定出目标属性的属性值。可以理解的是,本申请实施例对属性值数组strings所包含的属性值的数量和具体内容不作限定,特在此说明。
综上所述,基于上述步骤s11-s13所示的具体实施过程,可实现获取目标属性的属性值,这种通过索引获取属性值的方式,可以避免直接将属性值记录到内存快照文件,在一定程度上可节省内存空间,从而提升计算机设备的运行效率。
S302、根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系。
由前述描述可知,任一内存节点的节点属性可包括边持有属性,该边持有属性可用于表征:以该任一内存节点作为父内存节点时,该任一内存节点所关联的连边,具体是该任一内存节点所关联的连边的数量;同理,任一连边的边属性可包括边指向属性,该边指向属性用于表征该任一连边所指向的子内存节点。基于此,可根据各内存节点的边持有属性的属性值,确定各连边所关联的父内存节点;以及,根据各连边的边指向属性的属性值,确定各连边所指向的子内存节点;再根据每个连边所关联的父内存节点,和每个连边所指向的子内存节点,得到内存空间包括的各内存节点之间的连接关系。
其中,内存空间包括的各内存节点之间的连接关系,可是通过构建内存空间的内存图得到的,具体是按照每个连边所关联的父内存节点和所指向的子内存节点,采用各连边将各内存节点进行连接,得到内存空间的内存图,该内存图可称为图型数据结构,该内存图可用于表示内存空间包括的一个或多个内存节点之间的连接关系。一种示例性的各内存节点之间的连接关系的示意图可参见图5,如图5所示,内存空间包括内存节点A、内存节点B和内存节点C,按照每个连边所关联的父内存节点和所指向的子内存节点,采用各连边将内存节点A、内存节点B和内存节点C进行连接,以通过连接后的图型数据结构表征各内存节点之间的连接关系。其中,内存节点的相关介绍可参见前述相关描述;连边可是指连接两个内存节点的边,连边是有向边,所谓有向边可理解为连边具有指向方向(即带有一个箭头)的边;即该内存图是采用各连边连接各个内存节点所得到的有向图;与有向边不含箭头的一端相连的内存节点称为该有向边所关联的父内存节点(如内存节点A),同理,该有向边的箭头所指向的内存节点称为子内存节点(如内存节点B)。
由于内存节点可以有多个连边,如该内存节点作为父内存节点延伸出多个连边,那么各内存节点和连边之间的对应的示例性关系可参见图6。如图6所示,假设内存空间包括内存节点node0和内存节点1,且内存节点node0的边持有属性指示内存节点node0拥有2条边,即以内存节点node0为父内存节点延伸的连边数量为2条,内存节点node1的边持有属性指示内存节点node1拥有3条边,即以内存节点node1为父内存节点延伸的连边数量为3条,那么根据各内存节点的节点属性“边持有属性”可知道每个内存节点拥有的连边数量,从而确定每个连边的开始位置(即连边对应的父内存节点)。进一步的,根据各连边的边属性“边指向属性”可确定连边的结束位置(即连边所指向的子内存节点)。综上所述,在确定各连边所关联的父内存节点和所指向的子内存节点的情况下,自然可得到各内存节点之间的连接关系。
不难理解的是,图5只是本申请实施例给出的一种示例性的内存图,图6也只是本申请实施例给出的一种示例性的内存节点与连边之间的对应关系;根据内存节点的数量不同,连边所关联的父内存节点和所指向的子内存节点不同,图5和图6还可以发生变化,特在此说明。另外,在实际应用中,是采用代码来代表各内存节点之间的连接关系,即计算机设备存储的是各内存节点之间的连接关系对应的代码,计算机设备可能并不会真的构建出可视化的内存图;上述给出内存图的结构示意图只是为了方便阅读者更好地理解,特在此说明。
S303、基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点。
S304、根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量。
步骤S303-S304中,基于前述步骤S301-S302所示的具体实施过程,得到内存空间包括的各内存节点之间的连接关系后,本申请实施例就可以基于该连接关系计算每个内存节点的可回收内存量retained_size,其中,内存节点的可回收内存量可用于表征:该内存节点被释放后能够被回收的内存量,从而可以基于内存节点的可回收内存量确定可能存在内存泄露的可疑内存节点,进而确定需要手动释放的可疑内存节点对应的对象(如对可疑内存对象进行读写的变量等),这样能帮助开发对象较为迅速的定位内存泄露的位置。
内存节点的可回收内存量是分析内存泄露的重要指标,该指标并不会直接的记录在堆快照(即前述提及的内存快照文件)中,需要开发对象手动计算。通常可使用垃圾回收算法来计算内存节点的可回收内存量,垃圾回收算法可包括但不限于:标记清楚算法(Mark-Sweep),复制算法(Copying),标记整理算法(Mark-Compact)以及分代收集算法等。为便于阐述,本申请实施例以内存空间包括的任一个内存节点表示为目标内存节点,以计算目标内存节点的可回收内存量为例,对计算可回收内存量的计算过程进行介绍:
首先,在各内存节点中确定出根内存节点后,可确定与根内存节点存在可达关系的目标内存节点。其中,与根内存节点之间存在可达关系的目标内存节点可是指:以根内存节点为遍历起点,能够遍历到的内存节点;为便于阐述可将与根内存节点之间存在可达关系的内存节点称为可达内存节点。并且,还支持对目标内存节点进行染色,以标记已找到的能到达到的目标内存节点。
然后,在已确定目标内存节点为可达内存节点的基础上,再确定与根内存节点之间存在不可达关系的参考内存节点。其中,与根内存节点之间存在不可达关系的参考内存节点可是指:在内存图中删除目标内存节点后,再以根内存节点为遍历起点,不能遍历到的内存节点;为便于阐述可将与根内存节点存在不可达关系的内存节点称为不可达内存节点。具体地,在已确定目标内存节点的基础上,确定参考内存节点的方式可包括:从内存图中移除目标内存节点,得到更新后的内存图;再从该更新后的内存图中的根内存节点为遍历起点,将无法遍历(或称为无法访问)到的内存节点确定为参考内存节点,此时确定该参考内存节点与根内存节点之间存在不可达关系。
最后,基于目标内存节点的节点属性“节点内存量”的属性值“内存量数值”,以及参考内存节点的节点属性“节点内存量”的属性值“内存量数值”,计算得到目标内存节点的可回收内存量。
下面结合附图7a,并以内存空间包括的任一个内存节点表示为目标内存节点,以计算目标内存节点的可回收内存量为例,给出本申请实施例提供的可回收内存量的计算过程。具体地,假设内存空间包括的内存节点为:内存节点1、内存节点2、内存节点3、内存节点4、内存节点5以及内存节点6,且这6个内存节点之间的连接关系如图7a所示。图7a所示的内存图自上而下可将各内存节点分为:根内存节点、中间内存节点和末端内存节点;其中,内存节点1作为内存图的根内存节点,向下延伸包括中间内存节点:内存节点2、内存节点3以及内存节点4,继续向下延伸包括末端内存节点:内存节点5和内存节点6。根据目标内存节点(如任一内存节点)属于根内存节点,中间内存节点或末端内存节点的不同,目标内存节点的可回收内存量的确定方式也不相同;下面分别对目标内存节点为根内存节点,中间内存节点或末端内存节点时,可回收内存量的具体确定过程进行介绍,其中:
(1)若目标内存节点是内存图中的根内存节点,如目标内存节点为图7a所示的内存节点1,则根据前述描述的参考内存节点的确定方式,可确定在目标内存节点为根内存节点的基础上,与根内存节点存在不可达关系的参考内存节点包括:内存图中除根内存节点之外的全部内存节点。
此实现方式下,根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量的实施过程可包括:将根内存节点的节点内存量的内存量数值,与内存图中除根内存节点之外的全部内存节点的节点内存量的内存量数值相加,得到第一相加内存量;将第一相加内存量,作为根内存节点的可回收内存量。也就是说,在目标内存节点为根内存节点的情况下,可以认为根内存节点的可回收内存量为:所有内存节点的节点内存量的内存量数值的总和。如图7b所示,根内存节点“内存节点1”的可回收内存量=内存节点1的节点内存量的内存量数值+内存节点2的节点内存量的内存量数值+内存节点3的节点内存量的内存量数值+内存节点4的节点内存量的内存量数值+内存节点5的节点内存量的内存量数值+内存节点6的节点内存量的内存量数值。
(2)若目标内存节点是内存图中的末端内存节点,该末端内存节点是内存图中不作为连边所关联的父内存节点的内存节点,如末端内存节点为图7a所示的内存图中的内存节点5和内存节点6,则根据前述描述的参考内存节点的确定方式,可确定在目标内存节点为末端内存节点的基础上,不存在与根内存节点存在不可达关系的参考内存节点。
此实现方式下,根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量的实施过程可包括:将目标内存节点的节点内存量的内存量数值,作为目标内存节点的可回收内存量。也就是说,将末端内存节点自身的节点属性“节点内存量”的属性值“内存量数值”,作为该末端内存节点的可回收内存量。继续参见图7b,末端内存节点“内存节点5”的可回收内存量=内存节点5的节点内存量的内存量数值;同理,末端内存节点“内存节点6”的可回收内存量=内存节点6的节点内存量的内存量数值。
(3)若目标内存节点是内存图中,除根内存节点和末端内存节点之外的任一内存节点,如目标内存节点为图7a所示的内存图中的内存节点2(或内存节点3或内存节点4),则根据前述描述的参考内存节点的确定方式,可确定在目标内存节点为内存节点2的基础上,与根内存节点存在不可达关系的参考内存节点可包括内存节点4。其中具体确定参考内存节点的过程可参见图7c,如图7c所示:先从内存图中移除目标内存节点(如内存节点2),具体是移除内存节点2以及与内存节点2相连的每条连边(如连边2和连边3),得到更新后的内存图。再将更新后的内存图中的根内存节点作为起始点(遍历起点),沿着连边遍历更新后的内存图中的各个内存节点;如图7c所示,从根内存节点“内存节点1”出发,沿着连边1可遍历到内存节点3,继续沿着连边5可遍历到内存节点5,沿着连边4可遍历到内存节点6,不能沿着任何连边遍历到内存节点4;则将更新后的内存图中未遍历到的内存节点(即内存节点4),作为与根内存节点存在不可达关系的参考内存节点。
此实现方式下,根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量的实施过程可包括:将目标内存节点的节点内存量的内存量数值,与参考内存节点的节点内存量的内存量数值,得到第二相加内存量;将第二相加内存量,作为目标内存节点的可回收内存量。也就是说,考虑到在内存节点2被释放或回收后,链接至内存节点2之后且未链接至其他内存节点的参考内存节点也不能再被使用(或访问),因此该参考内存节点也需要一并释放,那么确定内存节点2被释放后,可回收到的可回收内存量就是:目标内存节点自身的节点属性“节点内存量”的属性值“内存量数值”,与参考内存节点的节点属性“节点内存量”的属性值“内存量数值”之后。继续参见图7c,目标内存节点“内存节点2”的可回收内存量=内存节点2的节点内存量的内存量数值+内存节点4的节点内存量的内存量数值。
需要说明的是,对上述描述的采用垃圾回收算法计算各内存节点的可回收内存量的具体逻辑进行代码编写,可编写为如下代码片段:
还需说明的是,①上述是以计算各内存节点中的目标内存节点的可回收内存量为例进行阐述,在实际应用中本申请实施例支持计算每个内存节点的可回收内存量,各内存节点可按照在内存图中的位置按照上述相应方式得到相应的可回收内存量,本申请实施例在此不作详细阐述。②在目标内存节点为内存图中的中间内存节点的情况下,可能也不存在与根内存节点存在不可达关系的参考内存节点;这种情况时,该目标内存节点的可回收内存量为该目标内存量的节点属性“节点内存量”的属性值“内存量数值”。③在各内存节点之间的连边中,若存在弱引用属性类型weak的连边,则在计算垃圾回收时需要忽略其引用关系,即可以认为该连边在内存图中处于断开(或走不通)状态,在沿着连边遍历更新后的内存图中的各个内存节点的过程中,不沿着弱引用属性类型的连边遍历内存图中的内存节点。如图7d所示,在内存图中移除内存节点2之后,虽然内存节点3和内存节点6之间存在连边4,但考虑到连边4是弱引用属性类型,则认为该连边4是断开的;此时可确定与根内存节点存在不可达关系的参考内存节点包括:内存节点4和内存节点6,那么内存节点2的可回收内存量=内存节点2的节点内存量的内存量数值+内存节点4的节点内存量的内存量数值+内存节点6的节点内存量的内存量数值。
基于上述相关描述,可基于各内存节点之间的连接关系,计算得到内存空间包括的一个或多个内存节点中的每个内存节点的可回收内存量,从而有利于利用各内存节点的可回收内存量判断一个或多个内存节点中可能存在内存泄露的可疑内存节点。
本申请实施例中,支持获取内存空间的内存快照文件,并直接对内存快照文件进行分析处理,得到内存空间的描述数据,该描述数据可包括各内存节点的节点属性和连接各内存节点的各连边的边属性;这样可以基于各内存节点的节点属性和连接各内存节点的连边的边属性,确定各内存节点之间的连接关系;再基于连接关系从各内存空间中确定根内存节点,与根内存节点具有可达关系的目标内存节点,以及与根内存节点具有不可达关系的参考内存节点;从而根据目标内存节点以及参考内存节点,计算得到目标内存节点的可回收内存量。上述方案中,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量,从而帮助开发对象迅速定位存在内存泄露的内存节点。
上述图3实施例主要阐述了,直接对内存快照文件进行分析处理,并基于分析结果快速计算各内存节点的可回收内存量的具体实施过程。下面结合图8重点给出基于各内存节点的可回收内存量,从内存空间包括的一个或多个内存节点中确定出存在内存泄露的泄露内存节点(或称为可疑内存节点)的具体实施过程。
请参见图8,图8示出了本申请一个示例性实施例提供的另一种内存处理方法的流程示意图。该内存处理方法可以由前述提及的计算机设备执行,该方法可包括步骤S801-S805:
S801、获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据。
需要说明的是,步骤S801所示的具体实施过程,可参见图3所示实施例中步骤S301所示的具体实施过程的相关描述,在此不作赘述。
正如前述所描述的,内存快照的内存快照文件的可读性差,因此在基于步骤S801所示的具体实施步骤,对内存快照文件进行分析处理,得到内存空间的描述数据后;本申请实施例还支持基于分析得到的描述数据,将内存快照文件解析为可读性较好的Rust对象,具体是定义每个内存节点在Rust语言中的结构体类型中,具体如下:
特别需要注意的是,在该结构体类型中额外记录了每个连边所关联父内存节点,以便于在后续更好的帮助分析各内存节点之间的连接关系。
进一步的,可基于生成的Rust对象,将内存快照文件序列化为可读性较好的JSON结构,该JSON结构如下:
基于上述可读性较好的JSON结构,一方面有利于前端开发对象分析各内存节点之间的连接关系,另一方面浏览器也支持运行JS语言编写的JSON结构。
S802、根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系。
S803、基于各内存节点之间的连接关系,从各内存节点中确定根内存及得按,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点。
S804、根据目标内存节点的节点属性,以及参考内存节点的节点属性,计算目标内存节点的可回收内存量。
需要说明的是,步骤S802-S804所示的具体实施过程,可参见前述图3所示实施例中步骤S302-S304所示的具体实施过程的相关描述,在此不作赘述。
另外,在得到目标内存节点的可回收内存量后,可以得到目标内存节点的完整属性,具体如下:
在上述代码中,完整记录了目标内存节点的各节点属性的属性值,以及目标内存节点的可回收内存量。
S805、比较目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量,并判断目标内存节点是否为存在内存泄露的泄露内存节点。
基于前述步骤S801-S804所示的具体实施过程,可得到内存空间包括的各内存节点的可回收内存量,进一步,本申请实施例还支持根据各内存节点的可回收内存量和相应的节点属性“节点内存量”,从各内存节点中判断出存在内存泄露的部分内存节点,这部分内存节点可称可疑内存节点或泄露内存节点,对此不作限定。
为便于阐述,本申请实施例还是以基于目标内存节点的可回收内存量和节点内存量,判断目标内存节点是否为可疑内存节点为例,对泄露内存节点的具体判断过程进行介绍;其他内存节点是否为泄露内存节点的判断过程与目标内存节点类似。具体实现中,在得到目标内存节点的可回收内存量后,能知道该目标内存节点被释放后,垃圾回收机制能够回收到的内存大小;并且,该目标内存节点本身还具有节点内存量,该节点内存量表示该目标内存节点本身的内存大小。那么可以比较目标内训节点的节点内存量的内存量数值,与目标内存节点的可回收内存量,得到内存量比较结果;若该内存量比较结果满足内存泄露条件,则将目标内存节点作为存在内存泄露的泄露内存节点。其中,内存泄露条件包括:目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量之间的内存量差距,大于内存量阈值。
换句说话,如果内存量比较结果的取值较大,表明目标内存节点和可回收内存量与节点内存量之间的差距较大,进一步表明该目标内存节点可能引用有不再使用的内存节点,即该目标内存节点被释放后,可回收到除包括该目标内存节点本身的内存大小外,还可以回收到其引用的其他内存节点的内存大小,则确定该目标内存节点存在内存泄露。反之,如果内存量比较结果的取值较小,表明目标内存节点和可回收内存量与节点内存量之间的差距较小,进一步表明该目标内存节点被回收后只能释放其本身的内存大小,则确定该目标内存节点存在内存泄露。由上述描述的内存泄露条件可知,被确定为泄露内存节点的内存节点往往具有如下特性:内存节点本身的节点内存量小,但其被回收后可以释放较大的内存量。
通过对内存空间包括的各内存节点执行上述描述的判断过程,可确定各内存节点中包括的一个或多个泄露内存节点。进一步的,基于前述步骤所分析或计算得到的各种信息,包括但不限于:各内存节点之间的连接关系、节点属性以及可回收内存量等信息,可构建内存空间的节点关系图。其中,节点关系图是基于各内存节点之间的连接关系,采用各连边将各内存节点进行连接得到的有向图;该节点关系图的结构与前述描述的内存图的结构相似,但新增了标注泄露内存节点的部分。一种示例性的节点关系图的示意图可参见图9,如图9所示,基于各内存节点之间的连接关系,采用连边将各内存节点进行连接,可得到内存空间的节点关系图,该节点关系图记录了每个内存节点的各种信息,包括但不限于:节点名称、节点编号ID、节点内存量、可回收内存量以及连接的子内存节点等等。
S806、输出节点关系图。
在构建得到内存空间的节点关系图后,本申请实施例还支持输出该节点关系图;通过可视化输出该节点关系图,有利于基于较强可读性的节点关系图,帮助开发对象迅速定位服务端程序所存在的内存问题。
具体实现中,在直接对内存空间的内存快照文件进行分析处理,以得到内存空间的节点关系图后,可在开发对象所使用的终端设备中输出该节点关系图;并在该节点关系图中视觉突出显示自动判断出的一个或多个泄露内存节点。其中,视觉突出显示泄露内存节点是为了通过赋予泄露内存节点不同于其他内存节点的视觉展现,以提高给开发对象不同的视觉效果,直观告知开发对象哪些内存节点为泄露内存节点;本身实施例对视觉突出显示泄露内存节点的显示方式不作限定,包括但不限于:高亮显示(如提高显示亮度或采用不同颜色等)泄露内存节点(或泄露内存节点所在的区域);或者,增大泄露内存节点的节点尺寸;或者,为泄露内存节点进行批注显示;等等。
一种输出内存空间的节点关系图,并在节点关系图中视觉突出显示一个或多个泄露内存节点的示意图可参见图10;如图10所示,假设内存空间中包括内存节点1、内存节点2、内存节点3、…、内存节点6,且内存节点3被确定为泄露内存节点;则在内存节点1、内存节点2、内存节点3、…、内存节点6链接而成的节点关系图中,可对内存节点3进行染色(如颜色灰度相比于其他内存节点的颜色更深)以区分内存节点3和其他内存节点,实现快速找到多个内存节点中泄露内存节点。当然,在节点关系图中视觉突出显示泄露内存节点的显示方式,并不仅限于图10,特在此说明。
由前述描述可知,节点关系图中记录了每个内存节点的各种信息,那么本申请实施例还支持开发对象通过输出的节点关系图,快速定位每个内存节点的各种信息,如定位内存节点的节点内存量(即节点内存大小),内存节点被哪些父内存节点引用,内存节点引用了哪些子内存节点,以及内存节点的可回收内存量,等等信息。
具体实现中,在开发对象所使用的终端设备中显示内存空间的节点关系图的过程中,当开发对象具有查看任一内存节点的各种信息的需求时,可对该任一内存节点进行触发。此时终端设备检测到当节点关系图中的该任一内存节点被触发时,可显示该任一内存节点的节点信息(即前述提及的内存节点的各种信息),以便于开发对象查看。其中,内存节点的节点信息包括以下至少一个:节点标识,节点编号,节点内存量,节点作为父内存节点时关联的子内存节点,节点作为子内存节点时关联的父内存节点,以及可回收内存量等。
一种示例性的触发显示节点关系图中的任一内存节点的节点信息的示例性过程可参见图11;如图11所示,在终端设备提供的服务界面中显示有内存节点的节点关系图;当节点关系图中的任一内存节点,如内存节点3被触发后,可输出信息展示窗口1101;并在该信息展示窗口1101中显示内存节点3的节点信息。其中,本申请实施例对信息展示窗口1101在服务界面中的具体显示位置不作限定;例如,信息展示窗口1101可显示于服务界面中的固定位置(如右下角、中间位置或左上角等),再如,信息展示窗口1101可显示于被触发的内存节点所关联的位置(如与内存节点相邻的位置),等。
值得说明的是,信息展示窗口的具体样式,以及信息展示窗口所包含的各种信息的显示位置和显示样式,并不局限于图10所示。
本申请实施例中,一方面,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量。另一方面,本申请实施例还支持基于各内存节点的可回收内存量和相应的节点内存量,从内存空间包括的各内存节点中判断出泄露内存节点,并通过在节点关系图中视觉突出显示泄露内存节点,以直观告知开发对象泄露内存节点,从而帮助开发对象迅速定位存在内存泄露的内存节点。再一方面,本申请实施例采用Rust语言进行分析逻辑的编写,能够获得较高性能的分析性能,提高内存节点的可回收内存量的计算速度,从而帮助开发对象更快且更准确的定位泄露内存节点,完善Javascript生态。
上述详细阐述了本申请实施例的方法,为了便于更好地实施本申请实施例的上述方案,相应地,下面提供了本申请实施例的装置。
图12示出了本申请一个示例性实施例提供的一种内存处理装置的结构示意图;该内存处理装置可以用于是运行于计算机设备中的一个计算机程序(包括程序代码);该内存处理装置可以用于执行图3以及图8所示的方法实施例中的部分或全部步骤。请参见图12,该内存处理装置包括如下单元:
获取单元1201,用于获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据,描述数据包括:内存空间划分得到的各内存节点的节点属性,以及连接各内存节点的各连边的边属性;
处理单元1202,用于根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系;
处理单元1202,还用于基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点;
处理单元1202,还用于根据目标内存节点,以及与根内存节点存在不可达关系的参考内存节点,计算目标内存节点的可回收内存量,可回收内存量用于表征:目标内存节点被释放后能够被回收的内存量。
在一种实现方式中,任一内存节点的节点属性包括边持有属性,边持有属性用于表征:以任一内存节点作为父内存节点时,任一内存节点所关联的连边;连边是有向边,任一连边的边属性包括边指向属性,边指向属性用于表征任一连边所指向的子内存节点;
处理单元1202,用于根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系时,具体用于:
根据各内存节点的边持有属性的属性值,确定各连边所关联的父内存节点;以及,
基于各连边的边指向属性的属性值,确定各连边所指向的子内存节点;
根据每个连边所关联的父内存节点和所指向的子内存节点,构建内存空间的内存图;内存图是采用各连边连接各内存节点所得到的有向图,内存图可用于表示内存空间包括的各内存节点之间的连接关系。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是根内存节点,则与根内存节点存在不可达关系的参考内存节点包括:内存图中除根内存节点之外的全部内存节点;
处理单元1202,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将根内存节点的节点内存量的内存量数值,与内存图中除根内存节点之外的全部内存节点的节点内存量的内存量数值相加,得到第一相加内存量;
将第一相加内存量,作为根内存节点的可回收内存量。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是内存图中的末端内存节点,末端内存节点是内存图中不作为连边关联的父内存节点的内存节点,则不存在与根内存节点之间具有不可达关系的参考内存节点;
处理单元1202,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将目标内存节点的节点内存量的内存量数值,作为目标内存节点的可回收内存量。
在一种实现方式中,目标内存节点是内存图中,除根内存节点和末端内存节点之外的任一内存节点;末端内存节点是内存图中不作为连边关联的父内存节点的内存节点;
处理单元1202,用于从内存图中确定与根内存节点存在不可达关系的参考内存节点时,具体用于:
从内存图中移除目标内存节点,得到更新后的内存图;
将更新后的内存图中的根内存节点作为起始点,沿着连边遍历更新后的内存图中的各内存节点;
将更新后的内存图中未遍历到的内存节点,作为与根内存节点存在不可达关系的参考内存节点。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;处理单元1202,用于根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体用于:
将目标内存节点的节点内存量的内存量数值,与参考内存节点的节点内存量的内存量数值,得到第二相加内存量;
将第二相加内存量,作为目标内存节点的可回收内存量。
在一种实现方式中,若内存图中存在弱引用属性类型的连边,则处理单元1202,还用于:
在沿着连边遍历更新后的内存图中的各内存节点的过程中,不沿着弱引用属性类型的连边遍历内存图中的内存节点。
在一种实现方式中,描述数据还包括节点属性的节点属性类型,以及各连边的边类型;内存快照文件中包括节点属性字段、节点属性类型字段、边属性字段以及边类型字段;处理单元1202,用于对内存快照文件进行分析处理,得到内存空间的描述数据时,具体用于:
对节点属性字段进行属性分析,得到内存空间中各内存节点的节点属性,并对节点属性类型字段进行属性类型分析,得到节点属性的属性类型;
以及,对边属性字段进行属性分析,得到连接各内存节点的连边的边属性,并对边类型字段进行类型分析,得到连边的边类型;
其中,节点属性包括以下至少一个:节点类型、节点标识、节点编号、节点内存量、边持有属性以及节点的内存指示标识,边持有属性用于指示以内存节点作为父内存节点的连边数量;边属性包括以下至少一个:边类型、边标识以及边指向属性,边指向属性用于指示连边所指向的子内存节点。
在一种实现方式中,描述数据还包括内存节点的节点属性的属性值,以及连边的边属性的属性值;内存快照文件中还包括属性值数组和数据查询数组,属性值数组中包括目标属性的属性值,数据查询数组中包括目标属性的查询标识,目标属性是节点属性或边属性;处理单元1202,还用于:
从数据查询数组中确定目标属性关联的查询标识;
基于目标属性关联的查询标识生成目标属性的索引值;
按照目标属性的索引值,从属性值数组中确定目标属性的属性值。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;处理单元1202,还用于:
比较目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量,得到内存量比较结果;
若内存量比较结果满足内存泄露条件,则将目标内存节点作为存在内存泄露的泄露内存节点;
其中,内存泄露条件包括:目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量之间的内存量差距,大于内存量阈值。
在一种实现方式中,处理单元1202,还用于:
输出节点关系图,节点关系图是基于各内存节点的连接关系,采用各连边将各内存节点进行连接得到的有向图;
在节点关系图中视觉突出显示一个或多个泄露内存节点。
在一种实现方式中,处理单元1202,还用于:
当节点关系图中的任一内存节点被触发时,显示任一内存节点的节点信息;
其中,内存节点的节点信息包括以下至少一个:节点标识,节点编号,节点内存量,节点作为父内存节点时关联的子内存节点,节点作为子内存节点时关联的父内存节点,以及可回收内存量。
根据本申请的一个实施例,图12所示的内存处理装置中的各个单元可以分别或全部合并为一个或若干个另外的单元来构成,或者其中的某个(些)单元还可以再拆分为功能上更小的多个单元来构成,这可以实现同样的操作,而不影响本申请的实施例的技术效果的实现。上述单元是基于逻辑功能划分的,在实际应用中,一个单元的功能也可以由多个单元来实现,或者多个单元的功能由一个单元实现。在本申请的其它实施例中,该内存处理装置也可以包括其它单元,在实际应用中,这些功能也可以由其它单元协助实现,并且可以由多个单元协作实现。根据本申请的另一个实施例,可以通过在包括中央处理单元(CPU)、随机存取存储介质(RAM)、只读存储介质(ROM)等处理元件和存储元件的例如计算机的通用计算设备上运行能够执行如图3及图8所示的相应方法所涉及的各步骤的计算机程序(包括程序代码),来构造如图12中所示的内存处理装置,以及来实现本申请实施例的内存处理方法。计算机程序可以记载于例如计算机可读记录介质上,并通过计算机可读记录介质装载于上述计算设备中,并在其中运行。
本申请实施例中,支持获取内存空间的内存快照文件,并直接对内存快照文件进行分析处理,得到内存空间的描述数据,该描述数据可包括各内存节点的节点属性和连接各内存节点的各连边的边属性;这样可以基于各内存节点的节点属性和连接各内存节点的连边的边属性,确定各内存节点之间的连接关系;再基于连接关系从各内存空间中确定根内存节点,与根内存节点具有可达关系的目标内存节点,以及与根内存节点具有不可达关系的参考内存节点;从而根据目标内存节点以及参考内存节点,计算得到目标内存节点的可回收内存量。上述方案中,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量,从而帮助开发对象迅速定位存在内存泄露的内存节点。
图13示出了本申请一个示例性实施例提供的一种计算机设备的结构示意图。请参见图13,该计算机设备,包括处理器1301、通信接口1302以及计算机可读存储介质1303。其中,处理器1301、通信接口1302以及计算机可读存储介质1303可通过总线或者其它方式连接。其中,通信接口1302用于接收和发送数据。计算机可读存储介质1303可以存储在计算机设备的存储器中,计算机可读存储介质1303用于存储计算机程序,计算机程序包括程序指令,处理器1301用于执行计算机可读存储介质1303存储的程序指令。处理器1301(或称CPU(Central Processing Unit,中央处理器))是计算机设备的计算核心以及控制核心,其适于实现一条或多条指令,具体适于加载并执行一条或多条指令从而实现相应方法流程或相应功能。
本申请实施例还提供了一种计算机可读存储介质(Memory),计算机可读存储介质是计算机设备中的记忆设备,用于存放程序和数据。可以理解的是,此处的计算机可读存储介质既可以包括计算机设备中的内置存储介质,当然也可以包括计算机设备所支持的扩展存储介质。计算机可读存储介质提供存储空间,该存储空间存储了计算机设备的处理系统。并且,在该存储空间中还存放了适于被处理器1301加载并执行的一条或多条的指令,这些指令可以是一个或多个的计算机程序(包括程序代码)。需要说明的是,此处的计算机可读存储介质可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器;可选的,还可以是至少一个位于远离前述处理器的计算机可读存储介质。
在一个实施例中,该计算机可读存储介质中存储有一条或多条指令;由处理器1301加载并执行计算机可读存储介质中存放的一条或多条指令,以实现上述内存处理方法实施例中的相应步骤;具体实现中,计算机可读存储介质中的一条或多条指令由处理器1301加载并执行如下步骤:
获取内存空间的内存快照文件,并对内存快照文件进行分析处理,得到内存空间的描述数据,描述数据包括:内存空间划分得到的各内存节点的节点属性,以及连接各内存节点的各连边的边属性;
根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系;
基于各内存节点之间的连接关系,从各内存节点中确定根内存节点,与根内存节点存在可达关系的目标内存节点,以及与根内存节点存在不可达关系的参考内存节点;
根据目标内存节点,以及与根内存节点存在不可达关系的参考内存节点,计算目标内存节点的可回收内存量,可回收内存量用于表征:目标内存节点被释放后能够被回收的内存量。
在一种实现方式中,任一内存节点的节点属性包括边持有属性,边持有属性用于表征:以任一内存节点作为父内存节点时,任一内存节点所关联的连边;连边是有向边,任一连边的边属性包括边指向属性,边指向属性用于表征任一连边所指向的子内存节点;
计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行根据各内存节点的节点属性和各连边的边属性,确定各内存节点之间的连接关系时,具体执行如下步骤:
根据各内存节点的边持有属性的属性值,确定各连边所关联的父内存节点;以及,
基于各连边的边指向属性的属性值,确定各连边所指向的子内存节点;
根据每个连边所关联的父内存节点和所指向的子内存节点,构建内存空间的内存图;内存图是采用各连边连接各内存节点所得到的有向图,内存图可用于表示内存空间包括的各内存节点之间的连接关系。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是根内存节点,则与根内存节点存在不可达关系的参考内存节点包括:内存图中除根内存节点之外的全部内存节点;
计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体执行如下步骤:
将根内存节点的节点内存量的内存量数值,与内存图中除根内存节点之外的全部内存节点的节点内存量的内存量数值相加,得到第一相加内存量;
将第一相加内存量,作为根内存节点的可回收内存量。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;若目标内存节点是内存图中的末端内存节点,末端内存节点是内存图中不作为连边关联的父内存节点的内存节点,则不存在与根内存节点之间具有不可达关系的参考内存节点;
计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体执行如下步骤:
将目标内存节点的节点内存量的内存量数值,作为目标内存节点的可回收内存量。
在一种实现方式中,目标内存节点是内存图中,除根内存节点和末端内存节点之外的任一内存节点;末端内存节点是内存图中不作为连边关联的父内存节点的内存节点;
计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行从内存图中确定与根内存节点存在不可达关系的参考内存节点时,具体执行如下步骤:
从内存图中移除目标内存节点,得到更新后的内存图;
将更新后的内存图中的根内存节点作为起始点,沿着连边遍历更新后的内存图中的各内存节点;
将更新后的内存图中未遍历到的内存节点,作为与根内存节点存在不可达关系的参考内存节点。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行根据目标内存节点的节点属性和参考内存节点的节点属性,计算目标内存节点的可回收内存量时,具体执行如下步骤:
将目标内存节点的节点内存量的内存量数值,与参考内存节点的节点内存量的内存量数值,得到第二相加内存量;
将第二相加内存量,作为目标内存节点的可回收内存量。
在一种实现方式中,若内存图中存在弱引用属性类型的连边,则计算机可读存储介质中的一条或多条指令由处理器1301加载并还执行如下步骤:
在沿着连边遍历更新后的内存图中的各内存节点的过程中,不沿着弱引用属性类型的连边遍历内存图中的内存节点。
在一种实现方式中,描述数据还包括节点属性的节点属性类型,以及各连边的边类型;内存快照文件中包括节点属性字段、节点属性类型字段、边属性字段以及边类型字段;计算机可读存储介质中的一条或多条指令由处理器1301加载并在执行对内存快照文件进行分析处理,得到内存空间的描述数据时,具体执行如下步骤:
对节点属性字段进行属性分析,得到内存空间中各内存节点的节点属性,并对节点属性类型字段进行属性类型分析,得到节点属性的属性类型;
以及,对边属性字段进行属性分析,得到连接各内存节点的连边的边属性,并对边类型字段进行类型分析,得到连边的边类型;
其中,节点属性包括以下至少一个:节点类型、节点标识、节点编号、节点内存量、边持有属性以及节点的内存指示标识,边持有属性用于指示以内存节点作为父内存节点的连边数量;边属性包括以下至少一个:边类型、边标识以及边指向属性,边指向属性用于指示连边所指向的子内存节点。
在一种实现方式中,描述数据还包括内存节点的节点属性的属性值,以及连边的边属性的属性值;内存快照文件中还包括属性值数组和数据查询数组,属性值数组中包括目标属性的属性值,数据查询数组中包括目标属性的查询标识,目标属性是节点属性或边属性;计算机可读存储介质中的一条或多条指令由处理器1301加载并还执行如下步骤:
从数据查询数组中确定目标属性关联的查询标识;
基于目标属性关联的查询标识生成目标属性的索引值;
按照目标属性的索引值,从属性值数组中确定目标属性的属性值。
在一种实现方式中,内存节点的节点属性包括节点内存量,节点内存量的属性值为内存量数值;计算机可读存储介质中的一条或多条指令由处理器1301加载并还执行如下步骤:
比较目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量,得到内存量比较结果;
若内存量比较结果满足内存泄露条件,则将目标内存节点作为存在内存泄露的泄露内存节点;
其中,内存泄露条件包括:目标内存节点的节点内存量的内存量数值,与目标内存节点的可回收内存量之间的内存量差距,大于内存量阈值。
在一种实现方式中,计算机可读存储介质中的一条或多条指令由处理器1301加载并还执行如下步骤:
输出节点关系图,节点关系图是基于各内存节点的连接关系,采用各连边将各内存节点进行连接得到的有向图;
在节点关系图中视觉突出显示一个或多个泄露内存节点。
在一种实现方式中,计算机可读存储介质中的一条或多条指令由处理器1301加载并还执行如下步骤:
当节点关系图中的任一内存节点被触发时,显示任一内存节点的节点信息;
其中,内存节点的节点信息包括以下至少一个:节点标识,节点编号,节点内存量,节点作为父内存节点时关联的子内存节点,节点作为子内存节点时关联的父内存节点,以及可回收内存量。
本申请实施例中,支持获取内存空间的内存快照文件,并直接对内存快照文件进行分析处理,得到内存空间的描述数据,该描述数据可包括各内存节点的节点属性和连接各内存节点的各连边的边属性;这样可以基于各内存节点的节点属性和连接各内存节点的连边的边属性,确定各内存节点之间的连接关系;再基于连接关系从各内存空间中确定根内存节点,与根内存节点具有可达关系的目标内存节点,以及与根内存节点具有不可达关系的参考内存节点;从而根据目标内存节点以及参考内存节点,计算得到目标内存节点的可回收内存量。上述方案中,无需对内存空间的内存快照文件中各内存节点之间的连接关系进行转换,可直接基于内存空间中各内存节点之间的连接关系,快速计算各内存节点的可回收内存量,从而帮助开发对象迅速定位存在内存泄露的内存节点。
本申请实施例还提供一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述内存处理方法。
本领域普通技术人员可以意识到,结合本申请中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用,使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程设备。计算机指令可以存储在计算机可读存储介质中,或者通过计算机可读存储介质进行传输。计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如,同轴电缆、光纤、数字用户线(DSL))或无线(例如,红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如,固态硬盘(Solid State Disk,SSD))等。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (16)

1.一种内存处理方法,其特征在于,包括:
获取内存空间的内存快照文件,并对所述内存快照文件进行分析处理,得到所述内存空间的描述数据,所述描述数据包括:所述内存空间划分得到的各内存节点的节点属性,以及连接所述各内存节点的各连边的边属性;
根据所述各内存节点的节点属性和所述各连边的边属性,确定所述各内存节点之间的连接关系;
基于所述各内存节点之间的连接关系,从所述各内存节点中确定根内存节点,与所述根内存节点存在可达关系的目标内存节点,以及与所述根内存节点存在不可达关系的参考内存节点;
根据所述目标内存节点的节点属性和参考内存节点的节点属性,计算所述目标内存节点的可回收内存量,所述可回收内存量用于表征:所述目标内存节点被释放后能够被回收的内存量。
2.如权利要求1所述的方法,其特征在于,任一内存节点的节点属性包括边持有属性,所述边持有属性用于表征:以所述任一内存节点作为父内存节点时,所述任一内存节点所关联的连边;连边是有向边,任一连边的边属性包括边指向属性,所述边指向属性用于表征所述任一连边所指向的子内存节点;
所述根据所述各内存节点的节点属性和所述各连边的边属性,确定所述各内存节点之间的连接关系,包括:
根据所述各内存节点的边持有属性的属性值,确定所述各连边所关联的父内存节点;以及,
基于所述各连边的边指向属性的属性值,确定所述各连边所指向的子内存节点;
根据每个连边所关联的父内存节点和所指向的子内存节点,构建所述内存空间的内存图;所述内存图是采用所述各连边连接所述各内存节点所得到的有向图,所述内存图可用于表示所述内存空间包括的各内存节点之间的连接关系。
3.如权利要求2所述的方法,其特征在于,内存节点的节点属性包括节点内存量,所述节点内存量的属性值为内存量数值;若所述目标内存节点是所述根内存节点,则与所述根内存节点存在不可达关系的参考内存节点包括:所述内存图中除所述根内存节点之外的全部内存节点;
所述根据所述目标内存节点的节点属性和参考内存节点的节点属性,计算所述目标内存节点的可回收内存量,包括:
将所述根内存节点的节点内存量的内存量数值,与所述内存图中除所述根内存节点之外的全部内存节点的节点内存量的内存量数值相加,得到第一相加内存量;
将所述第一相加内存量,作为所述根内存节点的可回收内存量。
4.如权利要求2所述的方法,其特征在于,内存节点的节点属性包括节点内存量,所述节点内存量的属性值为内存量数值;若所述目标内存节点是所述内存图中的末端内存节点,所述末端内存节点是所述内存图中不作为连边关联的父内存节点的内存节点,则不存在与所述根内存节点之间具有不可达关系的参考内存节点;
所述根据所述目标内存节点的节点属性和参考内存节点的节点属性,计算所述目标内存节点的可回收内存量,包括:
将所述目标内存节点的节点内存量的内存量数值,作为所述目标内存节点的可回收内存量。
5.如权利要求2所述的方法,其特征在于,所述目标内存节点是所述内存图中,除所述根内存节点和末端内存节点之外的任一内存节点;所述末端内存节点是所述内存图中不作为连边关联的父内存节点的内存节点;
从所述内存图中确定与所述根内存节点存在不可达关系的参考内存节点,包括:
从所述内存图中移除所述目标内存节点,得到更新后的内存图;
将所述更新后的内存图中的所述根内存节点作为起始点,沿着连边遍历所述更新后的内存图中的各内存节点;
将所述更新后的内存图中未遍历到的内存节点,作为与所述根内存节点存在不可达关系的参考内存节点。
6.如权利要求5所述的方法,其特征在于,内存节点的节点属性包括节点内存量,所述节点内存量的属性值为内存量数值;所述根据所述目标内存节点的节点属性和参考内存节点的节点属性,计算所述目标内存节点的可回收内存量,包括:
将所述目标内存节点的节点内存量的内存量数值,与所述参考内存节点的节点内存量的内存量数值,得到第二相加内存量;
将所述第二相加内存量,作为所述目标内存节点的可回收内存量。
7.如权利要求5所述的方法,其特征在于,若所述内存图中存在弱引用属性类型的连边,则所述方法还包括:
在沿着连边遍历所述更新后的内存图中的各内存节点的过程中,不沿着所述弱引用属性类型的连边遍历所述内存图中的内存节点。
8.如权利要求1所述的方法,其特征在于,描述数据还包括节点属性的节点属性类型,以及各连边的边类型;所述内存快照文件中包括节点属性字段、节点属性类型字段、边属性字段以及边类型字段;所述对所述内存快照文件进行分析处理,得到所述内存空间的描述数据,包括:
对所述节点属性字段进行属性分析,得到所述内存空间中各内存节点的节点属性,并对所述节点属性类型字段进行属性类型分析,得到节点属性的属性类型;
以及,对所述边属性字段进行属性分析,得到连接各内存节点的连边的边属性,并对所述边类型字段进行类型分析,得到连边的边类型;
其中,节点属性包括以下至少一个:节点类型、节点标识、节点编号、节点内存量、边持有属性以及节点的内存指示标识,所述边持有属性用于指示以内存节点作为父内存节点的连边数量;边属性包括以下至少一个:边类型、边标识以及边指向属性,所述边指向属性用于指示连边所指向的子内存节点。
9.如权利要求8所述的方法,其特征在于,描述数据还包括内存节点的节点属性的属性值,以及连边的边属性的属性值;所述内存快照文件中还包括属性值数组和数据查询数组,所述属性值数组中包括目标属性的属性值,所述数据查询数组中包括目标属性的查询标识,所述目标属性是节点属性或边属性;所述方法还包括:
从所述数据查询数组中确定目标属性关联的查询标识;
基于所述目标属性关联的查询标识生成所述目标属性的索引值;
按照所述目标属性的索引值,从所述属性值数组中确定所述目标属性的属性值。
10.如权利要求1所述的方法,其特征在于,内存节点的节点属性包括节点内存量,所述节点内存量的属性值为内存量数值;所述方法还包括:
比较所述目标内存节点的节点内存量的内存量数值,与所述目标内存节点的可回收内存量,得到内存量比较结果;
若所述内存量比较结果满足内存泄露条件,则将所述目标内存节点作为存在内存泄露的泄露内存节点;
其中,所述内存泄露条件包括:所述目标内存节点的节点内存量的内存量数值,与所述目标内存节点的可回收内存量之间的内存量差距,大于内存量阈值。
11.如权利要求10所述的方法,其特征在于,所述方法还包括:
输出节点关系图,所述节点关系图是基于所述各内存节点的连接关系,采用所述各连边将所述各内存节点进行连接得到的有向图;
在所述节点关系图中视觉突出显示一个或多个泄露内存节点。
12.如权利要求11所述的方法,其特征在于,所述方法还包括:
当所述节点关系图中的任一内存节点被触发时,显示所述任一内存节点的节点信息;
其中,内存节点的节点信息包括以下至少一个:节点标识,节点编号,节点内存量,节点作为父内存节点时关联的子内存节点,节点作为子内存节点时关联的父内存节点,以及可回收内存量。
13.一种内存处理装置,其特征在于,包括:
获取单元,用于获取内存空间的内存快照文件,并对所述内存快照文件进行分析处理,得到所述内存空间的描述数据,所述描述数据包括:所述内存空间划分得到的各内存节点的节点属性,以及连接所述各内存节点的各连边的边属性;
处理单元,用于根据所述各内存节点的节点属性和所述各连边的边属性,确定所述各内存节点之间的连接关系;
所述处理单元,还用于基于所述各内存节点之间的连接关系,从所述各内存节点中确定根内存节点,与所述根内存节点存在可达关系的目标内存节点,以及与所述根内存节点存在不可达关系的参考内存节点;
所述处理单元,还用于根据所述目标内存节点,以及与所述根内存节点存在不可达关系的参考内存节点,计算所述目标内存节点的可回收内存量,所述可回收内存量用于表征:所述目标内存节点被释放后能够被回收的内存量。
14.一种计算机设备,其特征在于,包括:
处理器,适于执行计算机程序;
计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序被所述处理器执行时,实现如权利要求1-12任一项所述的内存处理方法。
15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序适于被处理器加载并执行如权利要求1-12任一项所述的内存处理方法。
16.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机指令,所述计算机指令被处理器执行时实现如权利要求1-12任一项所述的内存处理方法。
CN202211276708.0A 2022-10-17 2022-10-17 一种内存处理方法、装置、设备、介质及程序产品 Pending CN117009118A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211276708.0A CN117009118A (zh) 2022-10-17 2022-10-17 一种内存处理方法、装置、设备、介质及程序产品

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211276708.0A CN117009118A (zh) 2022-10-17 2022-10-17 一种内存处理方法、装置、设备、介质及程序产品

Publications (1)

Publication Number Publication Date
CN117009118A true CN117009118A (zh) 2023-11-07

Family

ID=88564215

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211276708.0A Pending CN117009118A (zh) 2022-10-17 2022-10-17 一种内存处理方法、装置、设备、介质及程序产品

Country Status (1)

Country Link
CN (1) CN117009118A (zh)

Similar Documents

Publication Publication Date Title
CN110741354B (zh) 呈现代码实体调用之间的差异
US8429620B2 (en) Memory leak diagnosis
US7853930B2 (en) Annotating graphs to allow quick loading and analysis of very large graphs
CN110162522B (zh) 一种分布式数据搜索系统及方法
CN107800757B (zh) 用户行为记录方法及装置
US10459704B2 (en) Code relatives detection
Lin et al. Dimsum: Discovering semantic data of interest from un-mappable memory with confidence
CN111813756A (zh) 一种日志检索系统、方法、装置、电子设备及存储介质
CN111752955A (zh) 数据处理方法、装置、设备及计算机可读存储介质
KR20180108850A (ko) 메모리 관리를 위한 보존 가비지 콜렉팅 및 정수 태깅 기법
CN107506622B (zh) 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法
CN111597422A (zh) 埋点映射方法、装置、计算机设备和存储介质
CN112579552A (zh) 日志存储及调用方法、装置及系统
CN117009118A (zh) 一种内存处理方法、装置、设备、介质及程序产品
EP3995966A1 (en) System and method for automatic application log messages grouping using logging framework code instrumentation
CN107656868B (zh) 一种利用线程私有数据获取线程名字的调试方法及系统
CN115481025A (zh) 自动化测试的脚本录制方法、装置、计算机设备及介质
CN116185889A (zh) 一种基于对象隐藏的内存优化方法、智能终端及存储介质
CN115185535A (zh) 依赖关系显示方法及装置、存储介质及电子设备
CN114527963B (zh) C++二进制文件中的类继承关系识别方法及电子装置
CN108614838B (zh) 一种用户群索引处理方法、装置及系统
CN110750569A (zh) 数据提取方法、装置、设备及存储介质
CN113326004B (zh) 云计算环境下高效日志集中化方法及设备
CN118378288B (zh) 一种基于Pin工具的加密算法动态检测方法及系统
CN117009439B (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