CN111736980B - 一种内存管理方法及装置 - Google Patents

一种内存管理方法及装置 Download PDF

Info

Publication number
CN111736980B
CN111736980B CN201910229665.2A CN201910229665A CN111736980B CN 111736980 B CN111736980 B CN 111736980B CN 201910229665 A CN201910229665 A CN 201910229665A CN 111736980 B CN111736980 B CN 111736980B
Authority
CN
China
Prior art keywords
reference ring
objects
information
ring
count value
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
CN201910229665.2A
Other languages
English (en)
Other versions
CN111736980A (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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN201910229665.2A priority Critical patent/CN111736980B/zh
Priority to EP20779864.6A priority patent/EP3937016A4/en
Priority to PCT/CN2020/072325 priority patent/WO2020192256A1/zh
Publication of CN111736980A publication Critical patent/CN111736980A/zh
Priority to US17/483,953 priority patent/US20220012085A1/en
Application granted granted Critical
Publication of CN111736980B publication Critical patent/CN111736980B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources
    • 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/0238Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
    • 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
    • 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
    • G06F12/0261Garbage collection, i.e. reclamation of unreferenced memory using reference counting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory management, e.g. access or allocation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

一种内存管理方法及装置,用以回收引用环中的对象所占用的内存。在使用该方法进行垃圾回收时,首先获取存储的第一引用环的信息,其中第一引用环为由多个对象形成的循环引用,第一引用环的信息包括第一引用环中的多个对象以及多个对象之间的引用关系;其次确定存在第二引用环,第二引用环的信息与所述第一引用环的信息匹配,第二引用环的信息包括第二引用环中的多个对象以及多个对象之间的引用关系;之后回收第二引用环中的多个对象所占用的内存。通过匹配引用环的信息的方式,实现对引用环的回收过程,可以避免由于无法回收引用环而导致的内存资源浪费的问题。

Description

一种内存管理方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存管理方法及装置等。
背景技术
垃圾回收是计算机技术中的一种用于对计算机内存进行自动管理的机制,其主要思想是:应用程序在计算机上运行时,会存在该应用程序中的一个对象引用另一个对象(该对象也可以称为内存储对象或者节点)的情况,而每个对象会占用计算机上的内存。若某个对象已经不再需要,也就是说,该对象不被其他任何一个对象引用,则该对象就应该予以释放,使得该对象占用的内存可以被其他对象使用,达到自动回收内存资源的效果。
目前,一种常用的用于实现垃圾回收的技术方案是引用计数(referencecounting,RC)算法。RC算法为每个对象维护一个引用计数值,当有应用程序中的对象1引用对象2时,则该对象2的引用计数就加1,当对象1不再引用对象2时,则对象2的引用计数减1。当对象2的引用计数值为0时,则对象2所占用的内存就会被底层的分配器回收。
然而,使用面向对象的编程语言实现的应用程序中可能会存在引用环的情况。请参考图1,在图1中,对象A引用对象B,对象B引用对象C,对象C引用对象A,从而对象A、对象B以及对象C构成了引用环。由于在图1所示的引用环中,各个对象之间相互引用,因此,该引用环中的各个对象的引用计数值最小为1,无法变为0,从而导致该引用环中的每个对象所占用的内存资源均无法回收,造成内存资源的浪费。
发明内容
本申请实施例提供一种内存管理方法及装置,用以回收引用环中的对象所占用的内存资源。
第一方面,本申请提供了一种内存管理方法,在该方法中,首先获取存储的第一引用环的信息,第一引用环为由多个对象形成的循环引用,第一引用环的信息包括第一引用环中的多个对象以及多个对象之间的引用关系。引用环(reference cycle)还可以称为循环引用,可用于表示多个对象的循环引用。例如,对象A引用对象B,对象B引用对象C,对象C引用对象A,对象A、B、C三个对象形成了一个循环引用,可用引用环描述将该三个对象形成的循环引用。或者,对象A引用对象B,对象B引用对象A,则对象A和对象B形成了一个循环引用。其中,第一引用环为不存在外部引用的引用环,外部引用表示除第一引用环中的对象之外的对象引用第一引用环中的任一对象。
然后,若确定存在第二引用环,且第二引用环的信息与所述第一引用环的信息匹配,第二引用环的信息包括所述第二引用环中的多个对象以及多个对象之间的引用关系,则回收所述第二引用环中的多个对象所占用的内存。例如,对象A引用对象B,则可以称为对象B为对象A直接引用的对象;对象A引用对象B,对象B引用对象C,则可以称为对象C为对象A间接引用的对象,对象B可以称为中间对象。处于间接引用关系的两个对象之间可以有至少一个中间对象,例如,对象A引用对象B,对象B引用对象C,对象C引用对象D,则对象D也可以称为对象A间接引用的对象。可将第二引用环中的多个对象可以为下面描述的第一对象和一个或多个第二对象形成的多个对象。
在上述技术方案中,通过使用第一引用环与第二引用环进行匹配,确定存在多个对象形成了第二引用环,则回收形成该第二引用环中的对象的内存资源,实现了回收引用环的效果,可以避免由于无法回收引用环而导致的内存资源浪费的问题。
在一种可能的设计中,第一引用环的信息还包括第一引用环中每个对象在第一引用环中的引用计数值,第二引用环的信息还包括第二引用环中每个对象在第二引用环中的引用计数值;第二引用环的信息与第一引用环的信息匹配包括第二引用环中多个对象与第一引用环中的多个对象一一对应,且第二引用环中每个对象的引用计数值与所述第一引用环中对应的对象的引用计数值相等。
在一种可能的设计中,所述第一引用环的信息包括被引用对象的标识,被引用对象的标识为被引用对象的存储地址,或为被引用对象存储地址相对于被引用对象的引用对象的存储地址的偏移量,或为被引用对象的名称。例如第一引用环中包括对象A引用对象B,则对象B为被引用对象,对象A为被引用对象的引用对象。
在一种可能的设计中,根据第一引用环的信息和第一对象的信息以及一个或多个第二对象中每个第二对象的信息,确定第一对象和一个或多个第二对象形成的引用环与第一引用环相同,所述第一对象的信息用于描述所述第一对象的引用关系,所述每个第二对象的信息用于描述所述每个第二对象的引用关系。
在上述技术方案中,在获取第一引用环的信息后,还可以获取第一对象的用于描述其与其他对象之间的引用关系的信息,以及,每个第二对象的用于描述其与其他对象之间的引用关系的信息,例如,若对象A引用对象B,则对象A的信息中可以记录该对象A引用对象B的引用关系,从而,根据第一引用环中的信息,与第一对象的信息和每个第二对象的信息,可以确定第一对象和与其由直接或间接引用关系的每个第二对象形成的引用环是否与第一引用环相同。
在一种可能的设计中,若所述第一引用环的信息包括所述多个对象中每个对象的引用关系和所述每个对象在所述第一引用环中的引用计数值,所述第一对象的信息包括所述第一对象的引用计数值,这里的第一对象的引用计数值为第一对象当前的引用计数值,所述每个第二对象的信息包括所述第二对象的引用计数值,所述根据所述第一引用环的信息和所述第一对象的信息以及所述一个或多个第二对象中每个第二对象的信息,则可以通过确定所述第一引用环中的多个对象之间的引用关系与所述第一对象和所述一个或多个第二对象之间引用关系是否相同,以及所述第一引用环的多个对象中的第三对象与所述第一对象和所述一个或多个第二对象中与所述第三对象一一对应的对象的引用计数值相同,所述第三对象为所述第一引用环的多个对象中的任一对象,所述第一引用环的多个对象与所述第一对象和所述一个或多个第二对象组成的多个对象一一对应。
在上述技术方案中,由于每个对象均可以被不同的对象引用,例如,可以被能够形成循环引用的对象引用,也可以被不能形成循环引用的对象引用,例如,对象A、对象B和对象C能够形成循环引用,其中,对象A还被对象D使用,若第一引用环的信息为对象A引用对象B,且对象B引用对象C,对象C引用对象A,由于第一引用环的信息中不包括对象D,则通过对象A~对象C的信息可以判断对象A~对象C形成的引用环与该第一引用环相同,但实际上,由该对象A~对象C形成的引用环还在被对象D使用,则由该对象A~对象C形成的引用环还不能被回收,也就是说,只有当一个引用环中的对象不被引用环之外的对象引用时,该引用环才能被回收,因此,为了能够提高采用本申请的内存管理方法回收引用环的准确性,该第一引用环的信息、第一对象的信息及每个第二对象的信息中还可以包括各个对象的引用计数值,这样,当第一对象和至少一个第二对象之间的引用关系和各个对象的引用计数值均与第一引用环的信息中相应的内容相同时,则可以回收由第一对象和至少一个第二对象形成的引用环。
在本申请实施例中,多个对象之间的引用关系可以理解为,由该多个对象的引用关系所形成的多条有向路径,或者,可以理解为由该多个对象中的起始对象经由该多个对象中除该起始对象之外其他每一个对象再次回到该起始对象所形成的有向路径,该起始对象可以是该多个对象中的任意一个对象。则,所述第一引用环中的多个对象之间的引用关系与所述第一对象和所述一个或多个第二对象之间引用关系相同,可以理解为,第一引用环的多个对象之间形成的第一有向路径与第一对象和一个或多个第二对象之间形成的第二有向路径相同,或,由第一引用环的多个对象中的起始对象经由该多个对象中除该起始对象之外其他每一个对象再次回到该起始对象所形成的有向路径,与由第一对象和一个或多个第二对象中的起始对象经由该多个对象中除该起始对象之外其他每一个对象再次回到该起始对象所形成的有向路径相同。
所述第一引用环的多个对象与所述第一对象和所述一个或多个第二对象组成的多个对象一一对应,可以理解为,所述第一引用环的多个对象按照该引用关系与所述第一对象和所述一个或多个第二对象组成的多个对象一一对应,按照该引用关系一一对象的第一引用环中的对象和第一对象和至少一个第二对象中的对象应该是相同的对象。
在一种可能的设计中,所述第一引用环的信息包括第三对象的标识和所述第三对象引用的对象的标识。
由于形成第一引用环的对象的数量可能较多,为了简化第一引用环的信息,减少第一引用环所占用的内存,在第一引用环的信息中,可以通过每个对象的标识与其所引用的对象的标识来表示各个对象之间的引用关系。
在一种可能的设计中,所述第三对象引用的对象的标识为所述第三对象引用的对象的存储地址,或为所述第三对象引用的对象的存储地址相对于所述第三对象的存储地址的偏移量,或为所述第三对象引用的对象的名称。
在上述技术方案中,可以通过多种方式来表示第一引用环中的每个对象,可以增加本申请内存管理方法的灵活性。
在一种可能的设计中,若所述第一对象为所述第一引用环的起始对象,所述第一引用环的多个对象包括所述起始对象、所述起始对象的终止对象,所述起始对象通过一个或多个中间对象间接引用所述终止对象,则所述第一引用环的信息可以包括:
所述起始对象的信息,所述起始对象的信息包括用于表示所述起始对象引用所述起始对象引用的对象的引用关系以及所述起始对象的引用计数值,所述起始对象的引用计数值用于表示在所述第一引用环中除所述起始对象之外的对象引用所述起始对象的次数;
所述一个或多个中间对象的信息,每个中间对象的信息包括用于表示所述中间对象引用另一个中间对象的引用关系以及所述中间对象的引用计数值,所述中间对象的引用计数值用于表示在所述第一引用环中除所述中间对象之外的对象引用所述中间对象的次数;
所述终止对象的信息,所述终止对象的信息包括所述第一引用环中引用所述起始对象的对象,所述终止对象的信息包括用于表示所述终止对象引用所述起始对象的引用关系以及所述终止对象的引用计数值,所述终止对象的引用计数值用于表示在所述第一引用环中除所述终止对象之外的对象引用所述终止对象的次数。
在一种可能的设计中,若所述第一对象为所述第一引用环的起始对象,所述第一引用环的多个对象包括所述起始对象和终止对象,所述起始对象直接引用所述终止对象,则所述第一引用环的信息,包括:
所述起始对象的信息,所述起始对象的信息包括用于表示所述起始对象引用所述终止对象的引用关系以及所述起始对象的引用计数值,所述起始对象的引用计数值用于表示在所述第一引用环中除所述起始对象之外的对象引用所述起始对象的次数;
所述终止对象的信息,终止对象包括所述第一引用环中引用所述起始对象的对象,所述终止对象的信息包括用于表示所述终止对象引用所述起始对象的引用关系以及所述终止对象的引用计数值,所述终止对象的引用计数值用于表示在所述第一引用环中除所述终止对象之外的对象引用所述终止对象的次数。
在一种可能的设计中,第一引用环的信息存储在第一对象的元数据中,第一对象为第一引用环的多个对象中最后一个被外部对象释放的对象,外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。元数据为用于描述数据的数据,具体的,元数据是用来描述第一对象的名称、第一对象所属的数据结构的类型及第一对象的存储位置。
由于第一引用环中可能包括多个对象,则可以为该第一引用环中的每个对象生成对应的引用环的信息,例如,以该第一引用环中的每个对象为起始对象,生成对应的引用环的信息。但是,为了节省第一引用环的信息占用的内存,则可以选择在第一引用环包括的多个对象中的其中一个或一部分对象中来生成该第一引用环的信息。且,可以将该第一引用环的信息存储在该一个或一部分对象的元数据中,或者也可以分配一个专用于存储该第一引用环的信息的存储单元,在此不作限制。
在一种可能的设计中,在获取所述存储的第一引用环的信息之前,内存管理方法还包括:获取应用程序在运行过程中产生的多个对象,多个对象中的任一对象为引用计数值大于0的对象;根据多个对象中每个对象的信息,确定多个对象之间的引用关系,每个对象的信息包括所述每个对象引用的对象的标识;根据多个对象之间的引用关系,生成并存储第一引用环的信息。具体的,每个对象引用的对象的标识可以为该对象的名称或该对象的存储地址。
在一种可能的设计中,确定任意一个对象的引用计数值小于或等于第一阈值,触发获取存储的第一引用环的信息的步骤,任意一个对象包含在第一引用环中。
在一种可能的设计中,在进行本申请实施例中的内存管理方法之前,先获取所述应用程序在运行过程中,引用计数值大于0的多个第四对象,根据所述多个第四对象中每个第四对象的信息,确定所述多个第四对象之间的引用关系,所述第四对象的信息包括所述第四对象的引用计数值以及所述第四对象引用的对象的标识,从而根据所述多个第四对象之间的引用关系,生成至少一个第二引用环的信息,每个第二引用环的信息用于描述形成所述第二引用环的多个对象之间的引用关系,所述至少一个第二引用环中包括所述第一引用环,最后,将所述第一引用环存储在所述第一对象的元数据中。
第一引用环的信息可以是预先存储的,这样可以在应用程序启动时便加载该第一引用环的信息。也可以是通过上述技术方案,在应用程序的运行过程中,根据业务进程运行状态,选择时机收集引用环信息,例如,可以是在计算设备处于空闲状态,通过自学习的方法获取的,可以动态调整该内存管理方法。
在一种可能的设计中,所述第一引用环为在一个应用程序的运行过程中形成的循环引用。
在上述技术方案中,从各个应用程序中获取的引用环的信息可以是不共享的,从而各个应用程序之间的内存管理方法可以是相互独立的,即使某一个应用程序在执行该内存管理方法时出现故障,也不用对其他应用程序产生影响。另外,本申请实施例中的内存管理方法是应用程序的单个业务线程中执行的,因此,该内存管理方法不需要暂停该应用程序的所有的业务线程的运行(即stop the world,STW)。
在一种可能的设计中,可以先获取所述第一对象的引用计数值,确定所述第一对象的引用计数值与第一阈值相同后,再执行本申请实施例中的内存管理方法。该第一阈值为所述第一引用环中的起始对象的引用计数值,或,所述第一对象与多个引用环的信息关联,所述第一阈值为多个起始对象的引用计数值的最大值,所述多个起始对象与所述多个引用环一一对应,所述起始对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象。
这样,只有在满足一定条件后,才执行本申请实施例中的内存管理方法,可以减少在不需要回收引用环的情况下执行内存管理方法的情况,可以减少该内存管理方法的执行次数,可以降低计算设备的负载。
在一种可能的设计中,该方法还包括:获取第一引用环中每个引用环的命中次数,命中次数用于表示回收第二引用环中的多个对象所占用内存的次数;确定多个引用环中每个引用环的命中率,命中率为所述命中次数与执行内存管理方法的次数的比值;删除命中率低于预设比值的第一引用环的信息或设置命中率低于预设比值的第一引用环的信息的状态为无效状态。
在一种可能的设计中,所述第一对象可以与多个引用环关联,也就是说,第一对象可以与不同的第二对象形成多个不同的引用环,则针对多个引用环,可以获取所述多个引用环中每个引用环的命中次数,以及使用所述每个引用环的信息进行匹配的次数,所述命中次数用于表示根据所述引用环的信息回收所述引用环中的对象的次数,若确定所述多个引用环中每个引用环的命中率,所述命中率为所述命中次数与执行所述内存管理方法的次数的比值,则删除所述命中率低于预设比值的引用环的信息或设置所述命中率低于预设比值的引用环的信息的状态为无效状态。
在上述技术方案中,若计算设备正在执行计算量较大的任务时,命中率过低且匹配频繁的引用环的信息会给计算设备造成更大的计算压力,从而可以上述功能,将命中率在一定阈值以下的引用环的信息删除或者设置为无效状态,可以提高回收引用环的效率。
在一种可能的设计中,在设置命中率低于预设比值的第一引用环的信息的状态为无效状态之后,该方法还包括:
确定未被回收的对象的数量大于第二阈值,未被回收的对象的引用计数值大于0;
将无效状态的第一引用环的信息的状态恢复为有效状态。
在一种可能的设计中,在设置所述命中率低于预设比值的引用环的信息的状态为无效状态之后,若确定回收所述第一对象及所述一个或多个第二对象所占用的资源后,未被回收所占用的资源的第五对象的数量大于第二阈值,该第五对象的引用计数值大于0,则可以将无效状态的引用环的信息的状态恢复为有效状态。
由于应用程序处于不同的场景时,例如,启动场景,安装插件场景等,形成的引用环可能是不同的,因此,当应用程序中未回收的对象的数量较多时,则说明该应用程序中处于有效状态的引用环的信息不适用于该场景,从而可以将之前设置为无效状态的引用环的信息设置为有效状态,可以提高内存管理方法的有效性。
第二方面,提供一种内存管理装置,该内存管理装置可以是终端设备,也可以是终端设备中的装置。该内存管理装置包括处理器,用于实现上述第一方面描述的方法。该内存管理装置还可以包括存储器,用于存储程序指令和数据。该存储器与该处理器耦合,该处理器可以调用并执行该存储器中存储的程序指令,用于实现上述第一方面描述的方法中的任意一种方法中。该内存管理装置还可以包括通信接口,该通信接口用于该内存管理装置与其它设备进行通信。示例性地,该其它设备为其他终端或服务器。
在一种可能的设计中,该内存管理装置处理器和通信接口,其中:
该处理器通过该通信接口,获取存储的第一引用环的信息,第一引用环为由多个对象形成的循环引用,第一引用环的信息包括第一引用环中的多个对象以及多个对象之间的引用关系;以及,确定存在第二引用环,所述第二引用环的信息与所述第一引用环的信息匹配,所述第二引用环的信息包括所述第二引用环中的多个对象以及多个对象之间的引用关系;回收所述第二引用环中的多个对象所占用的内存。
在一种可能的设计中,该处理器根据该第一引用环的信息和该第一对象的信息以及该一个或多个第二对象中每个第二对象的信息,确定该第一对象和该一个或多个第二对象形成的引用环与该第一引用环相同,该第一对象的信息用于描述该第一对象的引用关系,该每个第二对象的信息用于描述该每个第二对象的引用关系。
在一种可能的设计中,第一引用环的信息还包括第一引用环中每个对象在第一引用环中的引用计数值,所述第二引用环的信息还包括所述第二引用环中每个对象在所述第二引用环中的引用计数值;所述第二引用环的信息与所述第一引用环的信息匹配包括所述第二引用环中多个对象与所述第一引用环中的多个对象一一对应,且所述第二引用环中每个对象的引用计数值与所述第一引用环中对应的对象的引用计数值相等。
在一种可能的设计中,所述第一引用环的信息包括被引用对象的标识,所述被引用对象的标识为所述被引用对象的存储地址,或为所述被引用对象存储地址相对于所述被引用对象的引用对象的存储地址的偏移量,或为所述被引用对象的名称。
在一种可能的设计中,所述第一引用环的信息存储在所述第一对象的元数据中,所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
在一种可能的设计中,处理器还用于:获取所述应用程序在运行过程中产生的多个对象,所述多个对象中的任一对象为引用计数值大于0的对象;根据所述多个对象中每个对象的信息,确定所述多个对象之间的引用关系,所述每个对象的信息包括所述每个对象引用的对象的标识;根据所述多个对象之间的引用关系,生成并存储所述第一引用环的信息。
在一种可能的设计中,处理器还用于:确定任意一个对象的引用计数值小于或等于第一阈值,触发所述获取存储的第一引用环的信息的步骤,所述任意一个对象包含在所述第一引用环中。
在一种可能的设计中,所述任意一个对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
在一种可能的设计中,处理器还用于:获取所述第一引用环中每个引用环的命中次数,所述命中次数用于表示回收所述第二引用环中的多个对象所占用内存的次数;确定所述多个引用环中每个引用环的命中率,所述命中率为所述命中次数与执行所述内存管理方法的次数的比值;删除所述命中率低于预设比值的所述第一引用环的信息或设置所述命中率低于预设比值的所述第一引用环的信息的状态为无效状态。
在一种可能的设计中,处理器还用于:确定未被回收的对象的数量大于第二阈值,所述未被回收的对象的引用计数值大于0;将无效状态的所述第一引用环的信息的状态恢复为有效状态。
在一种可能的设计中,该第一引用环的信息包括该多个对象中每个对象的引用关系和该每个对象在该第一引用环中的引用计数值,该第一对象的信息包括该第一对象的引用计数值,该每个第二对象的信息包括该第二对象的引用计数值,该处理器,确定该第一引用环中的多个对象之间的引用关系与该第一对象和该一个或多个第二对象之间引用关系相同,以及该第一引用环的多个对象中的第三对象与该第一对象和该一个或多个第二对象中与该第三对象一一对应的对象的引用计数值相同,该第三对象为该第一引用环的多个对象中的任一对象,该第一引用环的多个对象与该第一对象和该一个或多个第二对象组成的多个对象一一对应;
在一种可能的设计中,该第一引用环的信息包括第三对象的标识和该第三对象引用的对象的标识。
在一种可能的设计中,该第三对象引用的对象的标识为该第三对象引用的对象的存储地址,或为该第三对象引用的对象的存储地址相对于该第三对象的存储地址的偏移量,或为该第三对象引用的对象的名称。
在一种可能的设计中,该第一引用环的信息存储在该第一对象的元数据中,该第一对象为该第一引用环的多个对象中最后一个被外部对象释放的对象,该外部对象为该第一引用环的多个对象之外引用该第一对象的对象,该元数据是用来描述该第一对象的名称、该第一对象所属的数据结构的类型及该第一对象的存储位置。
在一种可能的设计中,该处理器通过通信接口获取该应用程序在运行过程中的多个第四对象,该多个第四对象的任一对象为引用计数值大于0的对象;
该处理器根据该多个第四对象中每个第四对象的信息,确定该多个第四对象之间的引用关系,该第四对象的信息包括该第四对象的引用计数值以及该第四对象引用的对象的标识;以及,根据该多个第四对象之间的引用关系,生成至少一个第二引用环的信息,每个第二引用环的信息用于描述形成该第二引用环的多个对象之间的引用关系,该至少一个第二引用环中包括该第一引用环;并将该第一引用环存储在该第一对象的元数据中。
在一种可能的设计中,该第一引用环为在一个应用程序的运行过程中形成的循环引用。
在一种可能的设计中,该处理器通过该通信接口,获取该第一对象的引用计数值;以及,确定该第一对象的引用计数值与第一阈值相同;该第一阈值为该第一引用环中的起始对象的引用计数值,或,该第一对象与多个引用环的信息关联,该第一阈值为多个起始对象的引用计数值的最大值,该多个起始对象与该多个引用环一一对应,该起始对象为该第一引用环的多个对象中最后一个被外部对象释放的对象。
在一种可能的设计中,该第一对象与多个引用环关联,该处理器通过该通信接口获取该多个引用环中每个引用环的命中次数,以及使用该每个引用环的信息进行匹配的次数,该命中次数用于表示根据该引用环的信息回收该引用环中的对象的次数;以及,确定该多个引用环中每个引用环的命中率,该命中率为该命中次数与执行该内存管理方法的次数的比值;以及,删除该命中率低于预设比值的引用环的信息或设置该命中率低于预设比值的引用环的信息的状态为无效状态。
在一种可能的设计中,在该处理器设置该命中率低于预设比值的引用环的信息的状态为无效状态之后,该处理器确定回收该第一对象及该一个或多个第二对象所占用的资源后,未被回收所占用的资源的第五对象的数量大于第二阈值,该第五对象的引用计数值大于0,从而将无效状态的引用环的信息的状态恢复为有效状态。
第三方面,提供一种内存管理装置,该内存管理装置可以是终端设备,也可以是终端设备中的装置,该内存管理装置可以包括处理模块和获取模块,这些模块可以执行上述第一方面任一种设计示例中的所执行的相应功能,具体的:
获取模块,用于获取存储的第一引用环的信息,所述第一引用环为由多个对象形成的循环引用,所述第一引用环的信息包括所述第一引用环中的多个对象以及多个对象之间的引用关系;
处理模块,用于确定存在第二引用环,所述第二引用环的信息与所述第一引用环的信息匹配,所述第二引用环的信息包括所述第二引用环中的多个对象以及多个对象之间的引用关系;回收所述第二引用环中的多个对象所占用的内存。
在一种可能的设计中,所述第一引用环的信息还包括所述第一引用环中每个对象在所述第一引用环中的引用计数值,所述第二引用环的信息还包括所述第二引用环中每个对象在所述第二引用环中的引用计数值;所述第二引用环的信息与所述第一引用环的信息匹配包括所述第二引用环中多个对象与所述第一引用环中的多个对象一一对应,且所述第二引用环中每个对象的引用计数值域所述第一引用环中对应的对象的引用计数值相等。
在一种可能的设计中,所述第一引用环的信息包括被引用对象的标识,所述被引用对象的标识为所述被引用对象的存储地址,或为所述被引用对象存储地址相对于所述被引用对象的引用对象的存储地址的偏移量,或为所述被引用对象的名称。
在一种可能的设计中,所述第一引用环的信息存储在所述第一对象的元数据中,所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
在一种可能的设计中,所述获取模块还用于:获取所述应用程序在运行过程中产生的多个对象,所述多个对象中的任一对象为引用计数值大于0的对象;
所述处理模块还用于:根据所述多个对象中每个对象的信息,确定所述多个对象之间的引用关系,所述每个对象的信息包括所述每个对象引用的对象的标识;根据所述多个对象之间的引用关系,生成并存储所述第一引用环的信息。
在一种可能的设计中,所述处理模块还用于:
确定任意一个对象的引用计数值小于或等于第一阈值,触发所述获取存储的第一引用环的信息的步骤,所述任意一个对象包含在所述第一引用环中。
在一种可能的设计中,所述任意一个对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
在一种可能的设计中,所述获取模块还用于:获取所述第一引用环中每个引用环的命中次数,所述命中次数用于表示回收所述第二引用环中的多个对象所占用内存的次数;
所述处理模块还用于:确定所述多个引用环中每个引用环的命中率,所述命中率为所述命中次数与执行所述内存管理方法的次数的比值;
删除所述命中率低于预设比值的所述第一引用环的信息或设置所述命中率低于预设比值的所述第一引用环的信息的状态为无效状态。
在一种可能的设计中,所述处理模块还用于:确定未被回收的对象的数量大于第二阈值,所述未被回收的对象的引用计数值大于0;将无效状态的第一引用环的信息的状态恢复为有效状态。
在一种可能的设计中,该处理模块用于:
根据该第一引用环的信息和该第一对象的信息以及该一个或多个第二对象中每个第二对象的信息,确定该第一对象和该一个或多个第二对象形成的引用环与该第一引用环相同,该第一对象的信息用于描述该第一对象的引用关系,该每个第二对象的信息用于描述该每个第二对象的引用关系。
在一种可能的设计中,该第一引用环的信息包括该多个对象中每个对象的引用关系和该每个对象在该第一引用环中的引用计数值,该第一对象的信息包括该第一对象的引用计数值,该每个第二对象的信息包括该第二对象的引用计数值,该处理模块用于:
确定该第一引用环中的多个对象之间的引用关系与该第一对象和该一个或多个第二对象之间引用关系相同,以及该第一引用环的多个对象中的第三对象与该第一对象和该一个或多个第二对象中与该第三对象一一对应的对象的引用计数值相同,该第三对象为该第一引用环的多个对象中的任一对象,该第一引用环的多个对象与该第一对象和该一个或多个第二对象组成的多个对象一一对应;
在一种可能的设计中,该第一引用环的信息包括第三对象的标识和该第三对象引用的对象的标识。
在一种可能的设计中,该第三对象引用的对象的标识为该第三对象引用的对象的存储地址,或为该第三对象引用的对象的存储地址相对于该第三对象的存储地址的偏移量,或为该第三对象引用的对象的名称。
在一种可能的设计中,该第一引用环的信息存储在该第一对象的元数据中,该第一对象为该第一引用环的多个对象中最后一个被外部对象释放的对象,该外部对象为该第一引用环的多个对象之外引用该第一对象的对象,该元数据是用来描述该第一对象的名称、该第一对象所属的数据结构的类型及该第一对象的存储位置。
在一种可能的设计中,该获取模块还用于:获取该应用程序在运行过程中的多个第四对象,该多个第四对象的任一对象为引用计数值大于0的对象;
该处理模块还用于根据该多个第四对象中每个第四对象的信息,确定该多个第四对象之间的引用关系,该第四对象的信息包括该第四对象的引用计数值以及该第四对象引用的对象的标识;以及,
根据该多个第四对象之间的引用关系,生成至少一个第二引用环的信息,每个第二引用环的信息用于描述形成该第二引用环的多个对象之间的引用关系,该至少一个第二引用环中包括该第一引用环;将该第一引用环存储在该第一对象的元数据中。
在一种可能的设计中,该第一引用环为在一个应用程序的运行过程中形成的循环引用。
在一种可能的设计中,该获取模块还用于:获取该第一对象的引用计数值;
该处理模块还用于确定该第一对象的引用计数值与第一阈值相同;该第一阈值为该第一引用环中的起始对象的引用计数值,或,该第一对象与多个引用环的信息关联,该第一阈值为多个起始对象的引用计数值的最大值,该多个起始对象与该多个引用环一一对应,该起始对象为该第一引用环的多个对象中最后一个被外部对象释放的对象。
在一种可能的设计中,该第一对象与多个引用环关联,该获取模块还用于:
获取该多个引用环中每个引用环的命中次数,以及使用该每个引用环的信息进行匹配的次数,该命中次数用于表示根据该引用环的信息回收该引用环中的对象的次数;
该处理模块还用于确定该多个引用环中每个引用环的命中率,该命中率为该命中次数与执行该内存管理方法的次数的比值;以及,
删除该命中率低于预设比值的引用环的信息或设置该命中率低于预设比值的引用环的信息的状态为无效状态。
在一种可能的设计中,在该处理模块设置该命中率低于预设比值的引用环的信息的状态为无效状态之后,该处理模块还用于:
确定回收该第一对象及该一个或多个第二对象所占用的资源后,未被回收所占用的资源的第五对象的数量大于第二阈值,该第五对象的引用计数值大于0;
将无效状态的引用环的信息的状态恢复为有效状态。
第四方面,本申请实施例中还提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行第一方面该的方法。
第五方面,本申请实施例中还提供一种计算机程序产品,包括指令,当其在计算机上运行时,使得计算机执行第一方面该的方法。
第六方面,本申请实施例提供了一种芯片***,该芯片***包括处理器,还可以包括存储器,用于实现第一方面该的方法。该芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
上述第二方面至第六方面及其实现方式的有益效果可以参考对第一方面的方法及其实现方式的有益效果的描述。
附图说明
图1为引用环的一种示例的示意图;
图2为本申请实施例中提供的计算设备的一种示例的结构示意图;
图3为本申请实施例中提供的计算设备200的逻辑框图;
图4为本申请实施例中多个Dalvik虚拟机同时存在的示意图;
图5为本申请实施例中的一种应用场景的示例的示意图;
图6为现有技术中RC算法的处理流程示意图;
图7为本申请实施例提供的一种内存管理方法的流程图;
图8为本申请实施例中计算设备200中多个应用程序与多个Dalvik虚拟机的内存管理模块的对应关系的示意图;
图9为本申请实施例中提供的以Java编程语言描述的引用环的代码一种示例;
图10为本申请实施例中提供的以Python编程语言描述的引用环的代码一种示例;
图11为本申请实施例中与第一引用环对应的强连通图的示意图;
图12为本申请实施例中判断第一对象及至少一个第二对象是否形成第一引用环的一种示例的流程图;
图13为现有技术中的采用追踪算法进行垃圾回收的示意图;
图14为本申请实施例提供的一种内存管理方法的另一种示例的流程图;
图15为本申请实施例提供的通信装置的示意性框图;
图16为本申请实施例提供的内存管理方法的另一示例的流程图;
图17为本申请实施例提供的内存管理装置的再一示意性框图;
图18为本申请实施例提供的内存管理装置的再一示意性框图。
具体实施方式
为了使本申请实施例的目的、技术方案和优点更加清楚,下面将结合说明书附图以及具体的实施方式对本申请实施例中的技术方案进行详细的说明。以下,对本申请实施例中的部分用语进行解释说明,以便于本领域技术人员理解。
1)计算设备,又称之为电子设备,计算设备可以具体为终端设备或者服务器式终端设备。具体的,终端设备可以是移动式或便携式并执行无线通信的各种类型的计算机***或设备中的任一个计算机***或设备。例如可包括移动电话或智能电话(例如iPhoneTM、基于AndroidTM的电话)、便携式游戏设备(例如,Nintendo DSTM、PlayStation PortableTM、Gameboy AdvanceTM、iPhoneTM)、膝上型电脑、个人通信业务(personal communicationservice,PCS)电话、会话发起协议(session initiation protocol,SIP)话机、无线本地环路(wireless local loop,WLL)站、个人数码助理(personal digital assistant,PDA)、便携式互联网设备、音乐播放器、数据存储设备、其他手持设备以及可穿戴设备。
或者,计算设备还可以包括受限设备,例如功耗较低的设备,或存储能力有限的设备,或计算能力有限的设备等。例如包括条码、射频识别(radio frequencyidentification,RFID)、传感器、全球定位***(global positioning system,GPS)、激光扫描器等信息传感设备。
作为示例而非限定,在本申请实施例中,智能穿戴式设备,是应用穿戴式技术对日常穿戴进行智能化设计、开发出可以穿戴的设备的总称,如眼镜、手套、手表、服饰及鞋等。智能穿戴式设备即直接穿在身上,或是整合到用户的衣服或配件的一种便携式设备。智能穿戴式设备不仅仅是一种硬件设备,更是通过软件支持以及数据交互、云端交互来实现强大的功能。广义智能穿戴式设备包括功能全、尺寸大、可不依赖智能手机实现完整或者部分的功能,例如:智能手表或智能眼镜等,以及只专注于某一类应用功能,需要和其它设备如智能手机配合使用,如各类进行体征监测的智能手环、智能头盔、智能首饰等。
或者,该终端设备还可以是虚拟现实(virtual reality,VR)设备、增强现实(augmented reality,AR)设备、工业控制(industrial control)中的无线终端设备、无人驾驶(driverless)中的无线终端设备、远程手术(remote medical surgery)中的无线终端设备、智能电网(smart grid)中的无线终端设备、运输安全(transportation safety)中的无线终端设备、智慧城市(smart city)中的无线终端设备、智慧家庭(smart home)中的无线终端设备等。
2)对象(object),是应用程序的代码中的基本元素,例如,可以是字符串、函数、变量、数组等。在面向对象(Object Oriented)的编程语言中,对象(object)是某一个类(class)的实例。对象具有唯一的标识符,对象包括属性(properties)和方法(methods),方法就是对象能够提供的服务,属性就是对象所具有的性质(例如,数据结构,该对象包括域等)。
3)内存泄漏,是指虽然对象不再被使用(可以认为该对象为无效对象)但是该对象所占用的内存资源没有被回收,从而该部分内存资源无法被其他对象使用,相当于该部分资源没有被任何一个有效的对象使用,造成了内存资源变小的现象。内存泄漏的程度可以通过无效对象占用的内存资源的大小来衡量,无效对象占用的内存资源越大,则内存泄漏越严重。例如,当存在引用环且该引用环中的所有对象均不被引用环之外的对象使用时,该引用环中的所有的对象均为无效对象。
4)垃圾回收(Garbage Collection,GC):在计算机科学中是一种存储器管理机制,或者称为内存管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收。
5)本申请实施例中“多个”是指两个或两个以上,鉴于此,本申请实施例中也可以将“多个”理解为“至少两个”。“至少一个”,可理解为一个或多个,例如理解为一个、两个或更多个。例如,包括至少一个,是指包括一个、两个或更多个,而且不限制包括的是哪几个,例如,包括A、B和C中的至少一个,那么包括的可以是A、B、C、A和B、A和C、B和C、或A和B和C。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,字符“/”,如无特殊说明,一般表示前后关联对象是一种“或”的关系。在本申请实施例中,“节点”和“节点”可以互换使用。
除非有相反的说明,本申请实施例提及“第一”、“第二”等序数词用于对多个对象进行区分,不用于限定多个对象的顺序、时序、优先级或者重要程度。
下面介绍本申请实施例的一种计算设备的结构图。图2示出了计算设备的一个示例性的结构示意图。如图2所示,计算设备200包括:处理器210、存储器220和通信接口230等部件。本领域技术人员可以理解,图2中示出的计算设备的结构并不构成对计算设备的限定,本发明实施例提供的计算设备可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
这些部件可通过一根或多根总线240或信号线进行通信,总线可以分为地址总线、数据总线、控制总线等。
处理器210可以是中央处理器(central processing unit,CPU),网络处理器(network processor,NP)或者CPU和NP的组合。处理器210还可以进一步包括硬件芯片。上述硬件芯片可以是专用集成电路(application-specific integrated circuit,ASIC),可编程逻辑器件(programmable logic device,PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,CPLD),现场可编程逻辑门阵列(field-programmable gate array,FPGA),通用阵列逻辑(generic array logic,GAL)或其任意组合。
存储器220,用于存储计算机程序,例如应用程序和操作***;处理器210可调用存储器220存储的计算机程序,从而实现该计算机程序定义的功能。
例如处理器210可以执行操作***从而在计算设备200上实现操作***的各种功能,处理器210也可以执行应用程序从而在计算设备200上实现该应用程序的各种功能。操作***可以为Windows***、MAC OS***、Linux***或者Android***等,当然也可以是面向未来的计算机***,本申请实施例描述的***是为了更加清楚的说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定。举例来说,应用程序可以为微信应用程序或百度应用程序等第三方应用程序,还可以为计算设备200的***应用程序,例如***服务(system server)或***界面(system ui)。需要说明的是,应用程序可以采用Java、Python、PHP、Lua等允许对象互相引用的面向对象编程语言进行编写。
存储器220可以包括存储程序区和存储数据区。存储程序区可存储操作***以及各种应用程序等。存储数据区用于存储有除计算机程序之外的其他数据,例如,操作***和应用程序运行过程中产生的数据(例如各种图片信息、视频信息等)。
存储器220可以包括易失性存储器(volatile memory),例如随机存取存储器(random-access memory,RAM);存储器220也可以包括非易失性存储器(non-volatilememory),例如快闪存储器(flash memory),硬盘(hard disk drive,HDD)或固态硬盘(solid-state drive,SSD);存储器220还可以包括上述种类的存储器的组合。存储器220的个数可以为一个或者多个,具体可以根据需要进行设置。存储器220也可以是处理器210中的存储器,在此不做限制。
通信接口230用于将计算设备200与其它电子设备连接,允许计算设备200在网络上进行通讯的硬件,可以实现数据包的发送与接收的硬件。例如,通信接口230可以通过有线或无线连接到网络以连接到其他电子设备,例如外部其它的终端设备或服务器。在计算设备200为终端设备时,通信接口230可以具体为调制解调器或者天线或者无线保真(wireless fidelity,WiFi)模块,在计算设备200为服务器时,通信接口230可以具体为射频单元或者天线。
进一步地,在一个实施例中,以计算设备200的操作***为Android***为例,如图3所示,计算设备200从逻辑上可划分为应用层21、操作***层22和硬件层23。其中,硬件层23可包括图2所示的处理器210、存储器220和通信接口230;应用层21包括一个或多个应用程序(应用程序201和应用程序202),具体应用程序可以为社交类应用、电子商务类应用、浏览器等任意类型的应用程序。操作***22作为硬件层23和应用层21之间的软件中间件,是管理和控制硬件与软件资源的计算机程序。
在一个实施例中,操作***层22包括库和运行时203(libraries and runtime)和内核204。其中,内核204用于提供底层***组件和服务,例如:电源管理、内存管理、线程管理、硬件驱动程序等;硬件驱动程序包括Wi-Fi驱动、传感器驱动、定位模块驱动等。库和运行时203也叫做运行时库,它为可执行程序在运行时提供所需要的库文件和执行环境。在一个实施例中,库与运行时203包括Android运行时(Android Runtime,ART)205,库206。库206是为可执行程序在运行时提供支持的程序库,包括浏览器引擎(比如webkit)、脚本执行引擎(比如JavaScript引擎)、图形处理引擎等。Android运行时205是能够把应用程序的字节码转换为机器码的虚拟机或虚拟机实例。该虚拟机可以为应用层21中的每个应用程序提供独立的运行环境。以Dalvik虚拟机为例,Dalvik虚拟机是一种基于寄存器的java虚拟机,是使用Android***的计算设备200中的应用程序的运行基础,其用来编译解析与对应的安卓安装包(android package,APK)包里的dex文件,产生能运行的字节码或者机器码,从而完成对应用程序中的对象的生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等功能。而内核204可以为Dalvik虚拟机提供调用内存资源的接口。
请参考图4,在计算设备200中,可以允许多个Dalvik虚拟机同时存在。例如,在图4中,有n个应用程序和n个Dalvik虚拟机。当需要启动一个应用程序时,首先由库和运行时库层203根据该应用程序运行所需要的环境(例如,应用程序运行所需要的内存大小)等因素,为该应用程序创建对应的Dalvik虚拟机或虚拟机实例,例如,应用程序201在运行时需要3M的内存,则库和Android运行时203通过内核204提供的接口,为该应用程序创建内存为3M的Dalvik虚拟机207。然后,该应用程序201则运行在创建的Dalvik虚拟机207中。对应的,为应用程序202创建对应的Dalvik虚拟机208。
应用程序所能实现的每个功能都是通过相应的计算机代码来实现的。由于对象是代码的基本元素,因此,当需要实现应用程序的一个或多个功能时,会调用相应功能对应的代码,并根据该代码创建多个对象。对应地,Dalvik虚拟机中用于实现内存管理功能的模块则需要分别给调用该代码而创建的每个对象分配所需的内存。
进一步地,由于Dalvik虚拟机的内存有限,为了提高资源利用率,提出了对内存进行自动管理的机制,即垃圾回收机制。具体来讲,当Dalvik虚拟机中用于实现内存管理的模块确定所创建的一个或多个对象已经不再使用时,则使得计算设备释放当前不使用的对象所占用的内存资源,从而该释放的内存资源可以给其他对象使用。
为了便于本领域技术人员清楚地理解垃圾回收过程,下面介绍本申请所涉及的应用场景的一种示例。
以计算设备200中应用程序201为浏览器应用程序为例,浏览器应用程序运行在Dalvik虚拟机207上。用户可以通过浏览器应用程序下载文档或者软件等数据。如图5所示,图5中,用户通过关键词在浏览器应用程序中搜索到了5个文档,用户想要下载第2个文档,则用户可以点击第2个文档的标题,从而浏览器应用程序中显示一个对话框,对话框中包括两个图标,第一个图标为打开文件的图标,第二个图标为下载该文件的图标。针对第二个图标,为了更加清楚表示出下载文件的含义,该第二个图标可以为动态显示,如图5所示,在图5中的第一时刻第二个图标中的箭头位于虚线对应的位置,在第二时刻,第二个图标的箭头位于实线对应的位置。
为了显示该第二图标,Dalvik虚拟机207创建4个对象,该4个对象分别命名为对象A、对象B、对象C以及对象D,其中,在第一时刻,对象A引用对象B,对象B引用对象C,对象C引用对象D,第二时刻,对象C在释放对象D(在图4中用虚线箭头表示),第三时刻,对象C引用对象A。
下面,基于上述应用场景,介绍现有技术中的垃圾回收过程。
目前,Dalvik虚拟机中垃圾回收的一种主流算法为RC算法。请参考图6,为RC算法的处理流程示意图。RC算法是在应用程序的运行过程中,通过对对象的引用次数进行计时的方式,实现回收内存资源的效果。
Dalvik虚拟机在引用对象的访问结束后,会存储每个对象的引用计数值,并判断引用计数值是否为0,若为0则释放该对象,否则不进行处理。在第一时刻,由于对象A引用对象B,对象B引用对象C,对象C引用对象D,因此,Dalvik虚拟机分别将对象B、对象C以及对象D的引用计数值加1,记录对象B、对象C以及对象D的引用计数值均为1。由于对象B、对象C以及对象D的引用计数值均不为0,因此,不对对象B、对象C以及对象D进行处理。在第二时刻,对象C释放对象D,因此,Dalvik虚拟机将对象D的引用计数值减1,从而对象D的引用计数值变为0。由于对象D的引用计数值为0,则Dalvik虚拟机释放对象D,对象B和对象C的引用计数值不为0,因此不对对象B和对象C进行处理。在第三时刻,对象C引用对象A,则Dalvik虚拟机将对象A的引用计数值加1,记录对象A的引用计数值为1。由于对象A~对象C的引用计数值均不为0,则Dalvik虚拟机1不对对象A~对象C进行垃圾回收处理,即不回收对象A~对象C占用的内存资源。
由图6可知,在第三时刻之后,Dalvik虚拟机1还存在对象A~对象C,且,由于对象A~对象C之间循引用环,从而每个对象的引用计数值均为1。由于引用计数值不为0,从而导致该环循引用环中的所有对象所占用的内存资源无法回收,造成内存资源的浪费。
鉴于此,本申请实施例提供一种内存管理方法,可应用于计算设备中,在应用程序的运行过程中,计算设备首先获取第一对象的第一引用环的信息,该第一引用环为由包括第一对象在内的多个对象形成的循环引用,该第一引用环的信息用于描述该多个对象之间的引用关系。然后,计算设备会使用该第一引用环的信息,确定该第一对象与该一个或多个第二对象是否形成该第一引用环。若确定该第一对象以及该一个或多个第二对象形成该第一引用环,则计算设备回收该第一对象及该一个或多个第二对象所占用的资源。
在上述技术方案中,可选的,可预先存储与该第一对象相关的引用环的信息,例如与第一对象相关的引用环为第一引用环,在垃圾回收过程中,使用与该第一引用环的信息,与该应用程序中的多个对象进行匹配,确定该多个对象是否形成了第一引用环,若形成了第一引用环,则回收形成该第一引用环的对象的资源,从而通过匹配引用环的信息的方式,实现对引用环的回收过程,可以避免由于无法回收引用环而导致的内存资源浪费的问题。
下面结合附图介绍本申请实施例提供的技术方案。
本申请实施例提供一种内存管理方法,请参见图7,为该方法的流程图。
在下面的介绍过程中,以本申请提供的技术方案应用在图5所示的应用场景中为例进行说明。作为一种示例,该方法可由如图2所示的计算设备200中的处理器210执行,或者,可以理解为,该方法可以由计算设备200中位于库和运行时层203的Dalvik虚拟机中用于实现内存管理功能的模块(可以简称Dalvik虚拟机的内存管理模块)来执行。
S701、获取存储的第一引用环的信息。
在本申请实施例中,该第一引用环是由包括第一对象在内的多个对象形成的循环引用,该第一引用环的信息用于描述形成该第一引用环的多个对象之间的引用关系。需要说明的是,该第一引用环为中的每个对象均不包括外部引用,如图1所示,也就是说,该引用环不被其他外部对象引用或不被使用时,该引用环中的每个对象所占用的内存资源均可以被回收。外部对象即该形成该第一引用环的多个对象之外的对象。
作为一种示例,在第一对象为如图5所述的浏览器应用程序中的对象A时,第一对象的第一引用环的信息可以为如下的引用关系:对象A引用对象B,对象B引用对象C,对象C引用对象A。第一引用环的信息还可以用链表进行表示,即A→B→C→A。在本申请实施例中不限定第一引用环的信息的具体形式。
第一引用环的数量可以为一个也可以为多个。在第一引用环的数量为多个时,可以理解为,第一对象与不同的其他对象形成了不同的引用环。作为一种示例,第一对象与第二对象形成一个引用环,或者,第一对象、第二对象以及第三对象形成一个引用环等。
在本申请实施例中,第一对象可以是计算设备200中的处于运行状态的应用程序的其中一个对象,也就是说,需要对每个应用程序中的每个对象进行垃圾回收处理。例如,计算设备200中处于运行状态的应用程序为如图5中所示的浏览器应用程序,其中,浏览器应用程序中包括如图5所示的对象A~对象D,则第一对象可以为对象A~对象D中的任意一个对象。或者,计算设备200中的处于运行状态的应用程序有多个时,可以对每一个应用程序分别进行垃圾回收处理,则在对某一个应用程序进行垃圾回收处理时,该第一对象可以是该应用程序中的其中一个对象。例如,请参考图8,计算设备200中处于运行状态的应用程序有浏览器应用程序和微信应用程序,那么,当浏览器应用程序所运行的Dalvik虚拟机的内存管理模块对浏览器应用程序中的对象,进行垃圾回收处理时,该第一对象可以为浏览器应用程序中的任意一个对象,当微信应用程序所运行的Dalvik虚拟机2的内存管理模块对微信应用程序中的对象,进行垃圾回收处理时,该第一对象可以为微信应用程序中的任意一个对象,在此不对第一对象进行限制。不同Dalvik虚拟机的内存管理模块可以独立地运行。
针对步骤S701,在一种可能的实施例中,步骤S701可以包括但不限于如下三种方式获取该第一引用环的信息。
第一种方式,第一对象的第一引用环的信息是预先设置的。
第二种方式,第一对象的第一引用环的信息是在应用程序的运行过程中获取的。
第三种方式,第一对象的第一引用环的信息是预先设置以及在应用程序的运行过程中获取的。
下面对这三种方式分别进行说明。
针对第一种方式:
可以在使用本申请实施例中的内存管理方法之前,首先将浏览器应用程序在计算设备200上试运行,Dalvik虚拟机的内存管理模块可以通过RC算法,对浏览器应用程序进行垃圾回收。获取应用程序的一个或多个进程各自的堆内存中的对象,这些对象为未被RC算法回收的多个对象,获取该多个对象中每个对象的信息,获取该应用程序中的引用环,确定这些对象是否形成引用环。其中,每个对象的信息用于描述该对象的引用关系。作为一种示例,获取到对象E和对象F,对象E的信息为对象E引用对象F,对象F的信息为对象F引用对象E,从而根据这两个对象的信息可以确定对象E和对象F构成引用环,因此,该由对象E和对象F构成的引用环为引用环。Dalvik虚拟机的内存管理模块可以获取微信应用程序在不同场景中未被RC算法回收的引用环,例如,在启动过程、切换过程或者用户操作等,用户操作例如用户浏览朋友圈的图片或者视频信息;然后将获取的引用环按照该引用环中的起始对象的数据类型(class)归类(也可以根据引用环中的其他对象的数据类型归类),并可以根据不同类别的引用环的数量为权重,对各种类别的引用环进行排序,最终得到使得内存泄漏最为严重或者内存泄漏达到阈值的引用环类型。
在本申请实施例中,该引用环中包括多个对象,该多个对象包括起始对象、起始对象的终止对象,该起始对象直接引用该终止对象或该起始对象通过一个或多个中间对象间接引用该终止对象。例如,若起始对象为对象A,终止对象为对象C,对象A引用对象C,这种情况下可以称为起始对象直接终止对象;若对象A引用对象B,且对象B引用对象C,这种情况下对象B可以称为中间对象,对象A通过对象B引用对象C,即起始对象通过中间对象间接引用终止对象。
在这种情况下,引用环的信息,包括:该起始对象的信息,该一个或多个中间对象的信息,以及该终止对象的信息。
其中,该起始对象的信息包括描述该起始对象引用该起始对象引用的中间对象的引用关系和该起始对象的引用计数值,该起始对象的引用计数值用于表示在该第一引用环中除该起始对象之外的对象引用该起始对象的次数;
每个中间对象的信息包括描述该中间对象引用该中间对象引用的中间对象或引用终止对象的引用关系和该中间对象的引用计数值,该中间对象的引用计数值用于表示在该第一引用环中除该中间对象之外的对象引用该中间对象的次数;
该终止对象为该第一引用环中引用该起始对象的对象,该终止对象的信息包括描述该终止对象引用该起始对象的引用关系和该终止对象的引用计数值,该终止对象的引用计数值用于表示在该第一引用环中除该终止对象之外的对象引用该终止对象的次数。
也就是说,通过各个对象之间的引用关系和每个对象被引用环中的其他对象的引用次数来表示多个对象之间的引用关系。
当然,当中间对象有多个时,例如,对象A引用对象B,对象B引用对象C,对象C引用对象D,则该中间对象为对象B和对象C,那么,该第一引用环的信息中包括的该中间对象引用该中间对象引用的中间对象的引用关系,可以理解为其中一个中间对象引用另一个中间对象的引用关系,例如,对象B引用对象C的引用关系。
例如,通过上述过程,得到图5所示的浏览器应用程序在第三时刻之后内存泄漏最为严重的引用环为如图9或图10所示的引用环的代码。其中,图9为以Java编程语言描述的引用环的代码,图10为以Python编程语言描述的引用环的代码。该引用环的信息如下:
1、该引用环所包括的多个对象。例如,该引用环由3个对象组成,分别为类型为class A的对象A、类型为class B的对象B和类型为class C对象C。其中,对象A、对象B和对象C均可以为起始对象,为方便说明,在下文中以对象A为起始对象为例。
2、每个对象的引用计数值,例如,由于对象A被对象C引用,对象B被对象A引用,对象C被对象B引用,因此,每个对象的引用计数值分别为1;
3、该多个对象间的引用关系,例如,该引用环中的对象引用关系为:对象A引用对象B,对象B引用对象C,对象C引用对象A,因此,形成了3条边(edge),分别为edge1、edge2以及edge3。
然后,可以通过编程语言描述该引用环的信息,并将该引用环的信息存入到计算设备500的存储器220中。例如,可以在存储器220中设置一个专用存储空间(可以称为引用环特征库),用于存储上述引用环的信息,将该引用环特征库作为预置资源,在浏览器应用程序启动时导入,从而当触发对该垃圾引用环进行回收时,则由Dalvik虚拟机的内存管理模块从该引用环特征库中获取。
在通过编程语言描述该垃圾引用环中各个对象之间的引用关系时,可以采用如下方式:
该起始对象与该起始对象引用的中间对象之间的引用关系通过该起始对象的标识以及该起始对象引用中间对象时使用的第一引用标识进行指示,该第一引用标识为该中间对象对应的存储地址或为该中间对象对应的存储地址相对于该起始对象的存储地址的偏移量或为该中间对象的标识。
该中间对象的信息用于描述该中间对象与该终止对象之间的引用关系,该中间对象与该终止对象之间的引用关系通过该中间对象的标识以及该中间对象引用终止对象时使用的第二引用标识进行指示,该第二引用标识为该终止对象对应的存储地址或为该终止对象对应的存储地址相对于该中间对象的存储地址的偏移量或为该终止对象的标识;
该终止对象与该起始对象之间的引用关系通过该终止对象的标识、该起始对象的标识以及该终止对象引用该起始对象时使用的第三引用标识进行指示,该第三引用标识为该起始对象对应的存储地址或为该起始对象对应的存储地址相对于该终止对象的存储地址的偏移量或为该起始对象的标识。
以图9所示的引用环的代码对上述信息进行说明。针对该起始对象与该起始对象引用的中间对象之间的引用关系,该起始对象的标识可以为该起始对象的名称(例如A)或者存储位置(例如对象A在内存中的存储地址为0x0010,则可以用0x0010)来进行标识。根据“class A{B b;}”可知,对象A中定义了一个域,该域(field)的名称为b且该域的类型为class B,由于对象B的类型也为classB,则可以表明对象A引用对象B,该起始对象引用中间对象时使用的第一引用标识可以用起始对象中的域名(例如“b”)进行指示。或者根据“a.b=b”可知,该起始对象引用中间对象时使用的第一引用标识可以用“a.b”进行指示。或者对象B的存储地址为0x0014,则可以直接用0x0014来指示对象B或者可以使用对象A与对象B的存储地址的偏移量(即4)来表示对象B。
由于一个应用程序中可能会存在多个引用环,因此,为了防止不同对象之间的混淆,在本申请实施例中,当使用对象的名称表示某个对象时,可以对该对象的名称进行整形,例如,使用对象的类型+jar名称(例如,A:libTest.jar),或者使用对象的类型+该对象所在的功能模块的名称(例如,对象A所在的功能模块为动态显示(dynamic display),则可以使用A.dynamic display)来唯一标识对象。
另外,在本申请实施例中,为了方便后续使用引用环的信息进行垃圾回收,可以为引用环分配一个栈,该栈中用于存储与该引用环的信息相匹配的对象。例如,当引用环包括的多个对象为对象A、对象B及对象C时,由于对象A为起始对象,对象B为中间对象以及对象C为终止对象,则假设当这三个对象入栈时,对象A首先入栈,则对象A在栈中的地址为0,对象B第二个入栈,则对象B在栈中的地址为1,对象C最后入栈,因此,对象C在栈中的地址为2。从而,也可以用各个对象在栈中的地址来表示各个对象。例如,当引用环中仅包括3个对象时,0表示起始对象,1表示中间对象,2表示终止对象。栈中的索引号和栈中的地址可以互换使用。
需要说明的是,该栈的具体使用方式在下文中相应的步骤进行说明。
针对该中间对象与该中间对象引用的终止对象之间的引用关系,以及该终止对象与该终止对象引用的起始对象之间的引用关系的说明,可以参照前述对该起始对象与该起始对象引用的中间对象之间的引用关系的说明,在此不再赘述。各个对象在栈中的索引号及各个对象中的域名是唯一且固定不变的。
作为一种示例,可以通过对形成该引用环的多个对象中每个对象的信息,以及与该垃圾引用环的终止对象与该起始对象之间的边的信息来描述引用环的信息。例如,通过对象A的信息,对象B的信息,对象C的信息,以及对象C和对象A之间的边的信息来描述该垃圾引用环的引用关系。
其中,起始对象的信息包括起始对象的类型和名称。
除起始对象之外的对象(即中间对象的信息和终止对象)的信息包括引用该对象的对象在栈中的索引号、引用该对象的对象中的域名、该对象的类型,以及该对象的引用计数值,例如,对象B的信息可以包括对象A的在栈中的索引号、对象A的域名、对象B的类型,以及对象B的初始引用计数值。
该边的信息包括该终止对象在栈中的索引号、该起始对象在栈中的索引号,以及该终止对象中的域名,例如,该边的信息包括对象C在栈中的索引号,对象A在栈中的索引号,以及对象C的域名。
需要说明的是,由于不同类型的对象可能包括相同的名称,因此,为了能够准确地表示一个对象,可以使用对象的类型及名称一起来标识该对象。另外,当一个对象不通过域名来指示其所引用的对象时,例如,对象A中不使用域b来指示对象A引用对象B,而是使用其他属性,则上述用于描述引用环的信息中使用的域名也可以替换为该其他属性,在下文中以域名为例。
作为一种示例,采用应用于Java编程语言的Cycle Pattern编码,对图9或图10所示的垃圾引用环进行描述,具体内容如下:
下面对上述Cycle Pattern编码中的各个代码的含义进行说明。
1,“class:A:libTest.jar”:用于描述头节点的信息,即该引用环的起始对象,其中,头节点可以该引用环中任意一节点,在上述示例中,以该引用环的头节点为对象A为例。由于一个应用程序中可能会存在多个引用环,因此,为了防止不同对象之间的混淆,在本申请实施例中,使用类名+jar名称来唯一标识对象。当头节点为对象A时,则该头节点的描述可以为class:A:libTest.jar。
需要说明的是,在上述示例中的jar名称“libTest.jar”仅为一种示例,在实际使用中,也可以是其他的名字。此外,在其他的实施方式中,也可以直接使用类名标识对象,即,头节点的信息直接描述为:class:A,在此不作限制。
2,“Cycle:2,1,1”:用于描述该引用环的除头节点之外的节点(Node)的数量、需要单独说明的边(Edge)的数量以及头节点的RC值,即头节点不被该引用环之外的对象引用时的RC值。
在上述示例中,第一个数字用于表示当前的引用环中除头节点之外的节点的数量,由于该引用环中包括对象A、对象B和对象C,对象A作为头节点,则剩余的节点数量为“2”。
第二个数字用于表示需要单独说明的边的数量。由于该引用环中除头节点外还包括2个节点,且,在前述介绍该引用环的头节点的信息时,只对该头节点的类型和名称进行了说明,并没有介绍该头节点与其他节点之间的引用关系,而对一个引用环而言,引用环中的对象会形成一个强连通图,因此,即使下面的描述中介绍了其他的2个节点的引用关系,但是仍然会有一个边的信息无法从头节点信息以及其他节点的信息中得到,这个边即需要单独说明。在该示例中,第二个数字的取值为1。
第三个数字用于表示头节点的RC值(也可以称为对象A的初始RC值)。在上述示例中,头节点为对象A,对象A被对象C引用一次,因此,第三个数字的取值为1。
需要说明的是,上述示例中的3个数字之间的顺序可以自由组合,例如,可以将用于指示头节点的RC值的数字放在3个数字的首位,或者,将用于指示其他节点的数量的数字放在3个数字的末位等,在本申请实施例中不作限制。
3,“Node:0,b,B:libTest.jar,1”和“Node:1,c,C:libTest.jar,1”:用于描述该引用环中除头节点外的其余2个节点的信息。这个2个节点的信息的添加顺序可以参照该引用环所对应的多个对象的引用关系。例如,从头节点(以对象A为例)开始顺序遍历时,先经过对象B再经过对象C,则,该Cycle Pattern编码中可以先添加对象B的信息,再添加对象C的信息。当然,也可以采用其他顺序添加各个节点的信息,在此不作限制。
需要说明的是,多个对象的引用关系也可以强连通分量(strong connextedcomponents,SCC)图来确定。强连通分量是由能够通过一定数量的有向路径互相连通的多个节点构成的,该多个节点以及该一定数量的有向路径构成了该强连通分量图(或者可以称为强连通图)。例如,如图11所示,对象A、对象B以及对象C之间互相连通,因此,对象A、对象B以及对象C形成强连通分量,对象A~对象C以及第一条边~第三条边形成强连通分量图。若以对象A为起始对象,则该强连通分量图中表示的引用关系为首先由对象A引用对象B,然后,对象B引用对象C,最后,对象C引用对象A。
在描述对象B这个节点的信息时,首先指出该节点的引用关系,是被对象A引用,对象A在栈中的索引为“0”,对象A的域的名称为“b”,域b对应的对象的类型为B:libTest.jar,对象B的RC值为“1”,即得到了除头节点外的第一个节点的信息。采用相同的方式,描述对象C这个节点的信息,即,对象C被对象B引用,对象B在栈中的索引为“1”,对象B的域的名称为“c”,域c对应的对象的类型为C:libTest.jar,对象C的RC值为“1”。
4,“Edge:2,0,a”:用于描述未能通过头节点和2个节点的信息表示出的边的信息,即在“Cycle:2,1,1”中需要单独说明的边的信息。由第3点中的描述可知,从各个节点的信息中,记录了节点间的引用关系,即能够获取在该引用环所对应的强连通图中的边的信息,例如,从第1个Node信息中能够得到的第一条边为对象A指向对象B,从第2个Node信息中能够得到第二条边为对象B指向对象C,针对第三条边,即对象C指向对象A(也就是该引用环中的最后一个对象与起始对象之间的边),则需要通过该语句进行描述。Edge的数量为该引用环中边的总数量与Node的数量之差。
具体来讲,第一个数字用于表示对象C在栈中的索引号,为“2”,第二个数字用于表示对象A在栈中的索引号,为“0”,对象C引用的域的名称为“a”,从而,通过该语句记录了第三条边为对象C指向对象A。
需要说明的是,Edge语句可以在Node语句之后,也可以是在Node语句之前,在此不作限制。
另外,需要说明的是,上述示例是以头节点为对象A而生成的一个Cycle Pattern编码,在实际使用中,每一个引用环可以生成与该引用环所包括的节点数量相同的多个Cycle Pattern编码,例如,可以以头节点为对象B,生成以“class:B:libTest.jar”为起始行的一个Cycle Pattern编码;以及,以头节点为对象C,生成以“class:C:libTest.jar”为起始行的一个Cycle Pattern编码,其中每一个Cycle Pattern编码中的内容与上述以“class:A:libTest.jar”为起始行的Cycle Pattern编码相似,在此不再赘述。需要说明的是,一个Cycle Pattern编码可以理解为,包括前述介绍的4种内容的一段代码。
当然,对于形成该引用环中的各个对象的生命周期(即,节点从创建的时刻到不再被使用的时刻之间的时长)相差较大的引用环,例如,对象C的生命周期为10毫秒(ms),对象B的生命周期为1秒(s),而对象A的生命周期为2s,可见,对象的生命周期之间的差值最大接近2s。如果对引用环中的每个对象都生成对应的Cycle Pattern编码,则会带来无效的匹配,增加处理器的开销,例如,若生成与对象C对应的Cycle Pattern编码,则需要每个10ms则进行一次匹配,而由于对象A和对象B的生命周期远大于10ms,因此,在该10ms内,对象A和对象B必然被该引用环之外的对象引用,因此,该引用环不是需要回收的引用环,从而该匹配即为无效的匹配,从而,在这种情况下,针对一个引用环,可以只设置与生命周期较大的对象对应的引用环的信息即可。
当获取上述Cycle Pattern编码后,则可以将该Cycle Pattern编码以镜像的形式保存在引用环特征库中。具体来讲,可以根据该Cycle Pattern编码中的头节点的信息,将该Cycle Pattern编码存储到不同的类的元数据中。例如,在上述示例中,是以头节点为对象A而生成的一个Cycle Pattern编码,则可以将该Cycle Pattern编码存储class A的元数据中。预先设置的Cycle Pattern编码已可覆盖该应用程序中使得内存泄漏比较严重的引用环类型,例如在Android***中,预先设置的Cycle Pattern编码可覆盖应用程序中的90%的引用环。
由上述过程可知,上述Cycle Pattern编码是预配置在计算设备200中的。
当然,引用环特征库中可能包括多个引用环的信息,则可以使用该引用环中的起始对象的标识来标记每个引用环的信息,这样,Dalvik虚拟机的内存管理模块可以根据每个引用环的信息的标识,从多个引用环的信息中确定与第一对象对应的第一引用环的信息。
在这种情况下,获取的引用环可能是***应用或者***的功能模块在运行过程中产生的引用环。
针对第二种方式:
Dalvik虚拟机的内存管理模块可以在执行本申请实施例中的垃圾回收之前,且浏览器应用程序还处于运行过程时,通过控制浏览器应用程序的暂停运行的状态,获取浏览器应用程序在运行过程中产生的引用环垃圾,从而生成对应的引用环的信息。
当然,为了减小对浏览器应用程序的运行过程的影响,Dalvik虚拟机的内存管理模块可以在计算设备200处于空闲状态时(例如,计算设备200处于休眠状态,或者计算设备200处于低功耗状态时),生成对应的引用环的信息。当然,也可以在其他时段生成该引用环的信息,在此不作限制。
Dalvik虚拟机的内存管理模块生成对应的引用环的信息的过程可以包括但不限于如下步骤:
Dalvik虚拟机的内存管理模块首先获取该应用程序在运行过程中,没有被该应用程序中的任意一个对象引用(即引用计数值为0)的多个第三对象,然后,根据每个第三对象的用于描述该第三对象的引用计数值以及该第三对象所引用的对象的标识的描述信息,确定该多个第三对象之间的引用关系。最后,根据该多个第三对象之间的引用关系,生成至少一个第二引用环的信息,该至少一个第二引用环为该第三对象中的全部或部分形成的循引用环,每个第二引用环的信息用于描述形成该第二引用环的多个对象之间的引用关系。
作为一种示例,Dalvik虚拟机的内存管理模块可以采用追踪(tracing)算法,请参考图12,为引用追踪算法的处理流程图。引用追踪算法主要包括3个阶段,分别为标记阶段、清理阶段以及压缩阶段。
在标记阶段时,以对象树的根节点作为起始点遍历对象,如果从根节点到某个对象可达,也就是说,该根节点间接引用了某个对象,则该对象为可达对象,并标记对象,否则,该对象是不可达对象,则不标记对象,从而构造出对象图。
在清理阶段完成后,则执行压缩阶段。计算设备可以根据当前未被清理的对象在内存中的分布情况,移动未被清理的对象在内存中的位置和/或对未被清理的对象进行压缩处理,从而使得未被清理的对象在内存中占用连续的内存空间,减少内存空洞。
通过追踪算法确定浏览器应用程序中的每个对象是否为可达对象,若可达则标记该对象,从而未被标记的对象则为浏览器应用程序中无法被回收的多个第三对象。该多个第三对象包括对象A、对象B以及对象C。
然后,Dalvik虚拟机的内存管理模块分别获取对象A、对象B和对象C的描述信息。例如,在浏览器应用程序中,用于描述对象A的代码为:“class A{B b;}”,用于描述对象B的代码为“class B{C c;}”,用于描述对象C的代码为“class C{A a;}”,则通过用于描述这3个对象的代码可知,对象A引用了对象B,对象B引用了对象C,对象C引用了对象A,因此,对象A、对象B以及对象C形成了一个强连通分量,根据该与强连通分量对应的强连通图,生成用于描述该引用环的信息,该引用环的信息与第一种方式中的相应内容相似,在此不再赘述。
当然,当第三对象包括除对象A~对象C之外的多个对象,且该多个对象能够形成另外的强连通分量,则Dalvik虚拟机的内存管理模块可以根据与每一个强连通分量对应的强连通图生成对应的引用环的信息。为了保证生成的引用环的信息的准确性,Dalvik虚拟机的内存管理模块还可以根据生成的引用环的信息对引用环的强连通性进行校验,例如,按照该引用环的信息遍历该引用环中的对象,若能够遍历该引用环中的每一个对象,则表示与该引用环的信息对应的引用环具有强连通性,否则,与该引用环的信息对应的引用环不具有强连通性(即非强连通性),从而可以去除与非强连通性的引用环对应的引用环的信息。
针对第三种方式:
在浏览器应用程序启动之前,可以通过第一种方式,预先在存储器220中存储垃圾引用环的信息,然后,在浏览器应用程序的运行过程中,使用第二种方式,再次获取该浏览器应用程序中的引用环的信息,并存储在存储器220中,从而可以保证能够回收该浏览器应用程序中的所有的引用环垃圾,以保证本申请实施例中的内存管理方法的有效性。
由于第三种方式即为第一种方式和第二种方式的结合,具体过程与前述两种方式相同,在此不再赘述。
Dalvik虚拟机的内存管理模块获取浏览器应用程序中的引用环的信息后,则可以将该引用环的信息加载到与该引用环的起始对象对应的元数据中。这样,在需要该引用环的信息时,可以直接从该对象对应的元数据中获取。该元数据是用来描述对象的名称、对象所属的数据结构的类型及对象的存储位置。
在另外一种情况下,在内存管理模块可能没有获取与第一对象对应的引用环的信息,例如,由对象A形成的引用环是以对象B作为头节点,描述如图9或图10所示的引用环,并将生成一个Cycle Pattern编码存储在对象B的元数据中,从而对象A的元数据中则不会存储Cycle Pattern编码。在这种情况下,对象A不会触发后续的引用环垃圾回收的过程。
另外,在上述描述中,以一个引用环的信息为例进行了说明,在实际使用中,一个应用程序中可能包括多个引用环,该多个引用环中包括与第一对象对应的第一引用环。在这种情况下,对每个引用环的处理过程与上述过程相似,在此不再赘述,在本申请实施例中,不对一个应用程序中包括的引用环的个数进行限制。另外,该第一引用环为在一个应用程序的运行过程中形成的循引用环。可以理解为,引用环的信息与应用程序之间有对应关系,不同的应用程序在运行过程中可能会形成不同的循引用环,不同的应用程序中形成的循引用环不能共享。
S702、确定存在第二引用环,所述第二引用环的信息与所述第一引用环的信息匹配;
在本申请实施例中,第二引用环的信息包括第二引用环中的多个对象以及多个对象之间的引用关系;第二引用环中的多个对象可以为第一对象和一个或多个第二对象组成的多个对象。
根据该第一引用环的信息,以及该第一对象的信息和一个或多个第二对象的信息,确定该第一对象与该一个或多个第二对象形成该第一引用环。该第一对象的信息用于描述该第一对象的引用关系,该一个或多个第二对象中的任一对象为该第一对象直接或间接引用的对象,该第二对象的信息用于描述所述第二对象的引用关系。例如对象A引用对象B,对象B引用对象C,对象C引用对象D,则,对象A间接引用对象B或对象C或对象D。
由于每个对象可能会引用其他对象,则当该对象引用其他对象后,Dalvik虚拟机的内存管理模块可以为该对象分配一部分内存,以保存该对象所引用的对象的信息。作为一种示例,第一对象为如图5所述的浏览器应用程序中的对象A,由于对象A引用了对象B,则对象A的信息中可以包括对象B的标识(例如可以为对象B的名称或者对象B的存储地址等),或者,对象A的信息中可以存储一个链表,该链表中记录了“对象A→对象B”的引用关系。第二对象的信息与第一对象的信息相似,在此不再赘述。在本申请实施例中,不对第一对象的信息以及第二对象的信息的具体形式做限制。
在本申请实施例中,步骤S702可以包括但不限于如下两种方式:
第一种确定方式:
当第一对象为该第一引用环的起始对象,该第一引用环的多个对象包括该起始对象、该起始对象的终止对象时,Dalvik虚拟机的内存管理模块在确定该第一引用环中的多个对象之间的引用关系,与该第一对象和该一个或多个第二对象之间引用关系相同,且该第一引用环中的多个对象与该第一对象和该一个或多个第二对象一一对应,且该第一引用环的多个对象,与该第一对象和该一个或多个第二对象中为一一对应关系的两个对象的引用计数值相同,则确定该第一对象与该一个或多个第二对象形成该第一引用环。在本申请实施例中,一一对应的对象可以理解为同一对象。
作为一种示例,以第一对象为如图5所示的对象A为例。由于对象A的第一引用环的信息为“对象A引用对象B,对象B引用对象C,对象C引用对象A,对象A~对象C的引用计数值均为1”,则Dalvik虚拟机的内存管理模块可以分别获取对象A~对象C的信息,确定对象A的信息中是否包括对象B的标识,确定对象B的信息中是否包括对象C的标识,以及,确定对象C的信息中是否包括对象A的标识。若为是,则确定对象C的信息中是否包括对象B的标识,如果不包括则确定对象B的引用计数值为1,与第一引用环的信息中对象B的引用计数值相同,并采用相同的方式,确定对象A和对象C的引用计数值是否与第一引用环的信息中的相应对象的引用计数值相同,在上述确定过程均为是时,则确定对象A~对象C形成了该第一引用环。
第二种确定方式:
当所述起始对象与所述起始对象引用的中间对象之间的引用关系通过所述起始对象的标识以及所述起始对象引用中间对象时使用的第一引用标识进行指示,所述中间对象的信息用于描述所述中间对象与所述终止对象之间的引用关系,所述终止对象与所述起始对象之间的引用关系通过所述终止对象的标识、所述起始对象的标识以及所述终止对象引用所述起始对象时使用的第三引用标识进行指示,该多个第二对象的数量为2个时:
Dalvik虚拟机的内存管理模块根据所述第一对象,以及用于描述所述起始对象与所述起始对象引用的中间对象之间的引用关系中包括的所述第一引用标识,确定该2个第二对象中的其中一个第二对象为所述第一对象引用的对象;
根据所述第一个第二对象,以及用于描述所述中间对象与所述终止对象之间的引用关系中包括的所述第二引用标识,确定该2个第二对象中的另外一个第二对象为该2个第二对象中的其中一个第二对象引用的对象;
根据所述第二个对象,以及用于描述所述终止对象与所述起始对象之间的引用关系中包括的所述第三引用标识,确定第一对象为该2个第二对象中的另外一个第二对象引用的对象;
进而确定所述第一引用环中的多个对象之间的引用关系,与所述第一对象和所述多个第二对象之间引用关系相同。
以及,确定所述第一对象的引用计数值与所述起始对象的引用计数值相同,以及,该2个第二对象中的其中一个第二对象的引用计数值与所述中间对象的引用计数值相同,以及,确定该2个第二对象中的另外一个第二对象的引用计数值与所述终止对象的引用计数值相同。
作为一种示例,请参考图13,Dalvik虚拟机的内存管理模块获取与对象A对应的第一引用环的信息后,则可以确定对象A的RC值与该第一引用环的信息中的起始对象的RC值是否相同。例如,由“Cycle:2,1,1”可知,起始对象的RC值为1。Dalvik虚拟机的内存管理模块可以分别获取对象A~对象C的信息,确定只有对象C的信息中包括对象A的标识,则确定对象A的引用计数值为1,与第一引用环的信息中的起始对象的RC值相同,则匹配成功,将对象A压入栈(即步骤S701中为垃圾回收过程分配的栈),其中对象A在栈中的索引号为0,并执行后续步骤,否则,匹配失败,退出判断流程,则内存管理模块确定不用回收由该对象A形成的引用环所占用的内存资源。
当对象A匹配成功后,Dalvik虚拟机的内存管理模块根据第一引用环的信息中第一个node的信息“Node:0,b,B:libTest.jar,1”,确定引用中间对象的对象在栈中的索引号为0,从而Dalvik虚拟机的内存管理模块从栈中获取索引号为0的对象,即为对象A。根据对象A中的域名“b”获取对象A引用的对象。由于域名“b”指示对象B,从而确定对象A引用对象B。然后获取对象B的信息,确定对象B的类型是否B:libTest.jar类型,若为是,则确定对象B的引用计数值是否为1。其中,确定对象B的引用计数值是否为1的方式与前述确定对象A的引用计数值是否为1相同,在此不再赘述。当为是时,确定对象B匹配成功,将对象B入栈,即对象B在栈中的索引号为1。
当对象B匹配成功后,Dalvik虚拟机的内存管理模块根据第一引用环的信息中第二个node的信息“Node:1,c,C:libTest.jar,1”,确定引用终止对象的对象在栈中的索引号为1,从而Dalvik虚拟机的内存管理模块从栈中获取索引号为1的对象,即为对象B。根据对象B中的域名“c”获取对象B引用的对象。由于域名“c”指示对象C,从而确定对象B引用对象C。然后获取对象C的信息,确定对象C的类型是否C:libTest.jar类型,若为是,则确定对象C的引用计数值是否为1。其中,确定对象C的引用计数值是否为1的方式与前述确定对象A的引用计数值是否为1相同,在此不再赘述。当为是时,确定对象C匹配成功,将对象C入栈,即对象C在栈中的索引号为2,得到如图14所示的引用环中的各个对象在栈中的分布关系示意图。
当对象C匹配成功后,Dalvik虚拟机的内存管理模块根据第一引用环的信息中的边的信息“Edge:2,0,a”,确定引用起始对象的对象在栈中的索引号为2,从而Dalvik虚拟机的内存管理模块从栈中获取索引号为2的对象,即为对象C。根据对象C中的域名“a”获取对象C引用的对象为对象A。根据对象A的信息,确定对象A的类型为classA:libTest.jar,与第一引用环的信息中的头节点的类型相同,则Dalvik虚拟机的内存管理模块确定第一对象与至少一个第二对象与第一引用环的信息匹配成功。
需要说明的是,在具体实施过程中,可以采用颜色标记法对实际对象进行标记。例如,当确定第一对象与第一引用环中的起始对象相匹配时,则可以将该第一对象标记为灰色,若不相同,则不对该第一对象进行标记。作为一种示例,可以在每个对象的元数据中存储用于指示颜色的信息,例如,通过1个比特表示该对象的颜色,当该比特的取值为0时表示白色,当该比特的取值为1时表示灰色,当然,也可以通过其他方式标记颜色,例如,可以分配一个内存资源,用于存储对象与颜色的对应关系等,在此不一一举例。对至少一个第二对象也是如此,在此不再赘述。
S703、回收第二引用环中多个对象所占用的内存。
Dalvik虚拟机的内存管理模块确定对象A~对象C形成了该第一引用环,则Dalvik虚拟机的内存管理模块回收该对象A~对象C所占用的资源。
若采用颜色标记法对每个对象进行标记,则当上述确定过程结束后,可以判断该第一对象和至少一个第二对象中的各个对象是否均为灰色,若全部为灰色,则可以将该第一对象和至少一个第二对象中的每个对象标记为白色,以等待底层分配器回收每个对象的内存资源;若该第一对象和至少一个第二对象中有至少一个对象不为灰色,则确定不能回收该各个对象的内存资源,这样,通过颜色标记法中每一种颜色所代表的含义(例如,灰色表示对象处于匹配过程中,白色表示该对象匹配完成且可以回收),以及各个颜色之间的逻辑顺序,可以保证并发回收引用环的正确性。
可见,通过上述技术方案可以实现回收引用环中的对象所占用的内存资源的效果。且,在回收引用环中的对象时,Dalvik虚拟机的内存管理模块只需要将需要判断的多个对象的信息与引用环的信息进行匹配即可,计算量小,从而可以减少引用环的回收过程的计算开销。
为了减少Dalvik虚拟机的内存管理模块进行上述匹配过程的次数,在本申请实施例中,请参考图15,在执行步骤S701之前,Dalvik虚拟机的内存管理模块可以先执行步骤S704,即确定第一对象满足触发条件。
在本申请实施例中,该触发条件为用于触发对该第一对象进行垃圾回收的过程的条件。该触发条件可以是,第一对象的引用计数值与第一阈值相同。该第一阈值可以是由本领域技术人员根据实际使用情况预估的,例如,本领域技术人员可以根据对象A在浏览器应用程序中可能会存在的引用环中的引用次数确定的,如果对象A只能被对象C引用,则该第一阈值可以为1,如果对象A可能被对象B和对象C引用,则该第一阈值可以为2。在本申请实施例中,以该第一阈值为1为例。
作为一种示例,该第一阈值,也可以根据Cycle Pattern编码中的信息确定,该第一阈值为该引用环的信息中的头节点的引用计数值,例如,上述Cycle Pattern编码中头节点的引用计数值为1,则该第一阈值设置为1,或,若第一对象与多个引用环的信息关联,则该第一阈值为该第一对象关联的多个引用环信息中的头节点的引用计数值的最大值,例如,当对象A的元数据中存储有2个Cycle Pattern编码,其中,一个Cycle Pattern编码中头节点的引用计数值为1,另一个Cycle Pattern编码中头节点的引用计数值为2,则该第一阈值可以设置为2。
当浏览器应用程序在运行过程中,Dalvik虚拟机的内存管理模块可以分配一部分内存,该内存中用于存储每个对象的引用计数值,当例如,该内存中可以存储如表1~表3所示的表格。在图5所示的应用场景中的第一时刻之后,得到如表1所示的表格。由于在第一时刻,对象A引用对象B,对象B引用对象C,对象C引用对象D,则表1中包括3个对象,分别为对象B、对象C以及对象C,由于每个对象均被其他对象引用一次,则每个对象的引用计数值为1。在图5所示的应用场景中的第二时刻之后,刷新表1,得到如表2所示的表格。在第二时刻,对象C释放对象D,因此,表2中对象D的引用计数值为0。在图5所示的应用场景中的第三时刻之后,刷新表2,得到如表3所示的表格。在第三时刻,对象C引用对象A,因此,表3中对象A的引用计数值为1。
表1
对象的标识 引用计数值
A 0
B 1
C 1
D 0
表2
对象的标识 引用计数值
A 0
B 1
C 1
D 0
表3
对象的标识 引用计数值
A 1
B 1
C 1
D 0
当然,为了节省该表格所占用的内存资源,则当某个对象的引用计数值变为0时,则可以将该对象从表格中删除。为简化说明书的篇幅,在本申请实施例中不再对此情况进行详细说明。
由表3所示的表格可知,对象A在第三时刻之后的引用计数值为1,与该第一阈值相同,因此,Dalvik虚拟机的内存管理模块确定该第一对象满足触发条件,从而对第一对象进行步骤S701~步骤S703的垃圾回收的过程。
需要说明的是,在这种情况下,在步骤S702中,Dalvik虚拟机的内存管理模块可以直接从该表格中获取第一对象和至少一个第二对象中每个对象的引用计数值,而不用根据各个对象的信息去判断,可以简化垃圾回收的过程。
需要说明的是,步骤S704为可选步骤,即不是必须要执行的,在图15中用虚线表示。
为了提高引用环的信息的命中率,减少Dalvik虚拟机的内存管理模块进行无效匹配的次数,在本申请实施例中,在执行完成步骤S703之后,还可以执行步骤S705,即记录每个引用环的信息的命中率。
在本申请实施例中,若第一对象包括多个引用环的信息,则Dalvik虚拟机的内存管理模块可以记录每个引用环的信息的命中率。每个引用环的信息的命中率命为该引用环的信息的命中次数与使用该引用环的信息进行匹配的次数的比值,该引用环的信息的命中次数用于指示根据该引用环的信息成功回收引用环中的对象的次数。
Dalvik虚拟机的内存管理模块在每次使用存储器220中的引用环的信息对第一对象对应的引用环进行匹配后,则更新使用该引用环的信息进行匹配的次数(也可以称为使用次数),将使用次数加1。且,Dalvik虚拟机的内存管理模块根据在此次匹配后的结果(即是否能够回收该引用环中的对象所占用的内存资源),更新该引用环的信息的命中次数。例如,当此次匹配后的结果为回收该引用环中的对象所占用的内存资源,则将该引用环的信息的命中次数加1,当此次匹配后的结果为不回收该引用环中的对象所占用的内存资源,则保持该引用环的信息的命中次数不变。然后,内存管理模块根据更新后的使用次数以及更新后的命中次数,获取并更新在此次匹配后该引用环的信息的命中率。
S706、确定该引用环的信息的命中率低于预设比值时,删除或无效该引用环的信息。
当某个引用环的信息的命中率过低时,则说明使用该引用环的信息无法实现对引用环进行回收的效果,若处理器210正在执行较大的计算任务,命中率过低且匹配频繁的Cycle Pattern会增加处理器210负载,从而,Dalvik虚拟机的内存管理模块可以将命中率过低的引用环的信息删除,从而可以降低处理器210的负载,可以提高引用环回收过程的执行效率。
当引用环的信息的命中率低于预设比值时,则认为该引用环的信息的命中率过低,该预设比值可以为5%或者7%等,在此不作限制。
另外,当第一对象与多个引用环的信息相关联时,还可以根据该引用环的信息的命中率筛选最适合的一个引用环信息,例如,将命中率最高的引用环的信息确认为最适合的引用环的信息,这样,处理器210也可以只根据该最适合的引用环的信息去进行上述匹配过程,从而可以进一步地降低处理器210的负载。
作为另一种示例,可以为每一段CyclePattern编码创建CyclePattern_info数据结构,该CyclePattern_info数据结构用于描述该CyclePattern编码的信息。CyclePattern_info数据结构可以包括如下信息中的至少一种:
1、该CyclePattern编码中包括的节点的数量;
2、该CyclePattern编码中包括的边的数量;
3、该CyclePattern编码中包括的头节点的RC值;
4、该CyclePattern编码的命中次数;
5、该CyclePattern编码的使用次数;
6、该CyclePattern编码是否为该第一对象的最后一个CyclePattern编码;
7、该CyclePattern编码是否有效。
上述第1种信息~第5种信息在前文中已进行说明,在此不再赘述。
针对第6种信息,当第一对象与多个CyclePattern编码关联时,可以对每个CyclePattern编码进行编号,将编号最大的CyclePattern编码作为与该第一对象关联的最后一个CyclePattern编码,并在该最后一个CyclePattern编码的CyclePattern_info数据结构中进行指示。这样,当Dalvik虚拟机的内存管理模块根据CyclePattern_info数据结构确定出与第一对象关联的最后一个CyclePattern编码后,则Dalvik虚拟机的内存管理模块可以不用再搜索与该第一对象关联的CyclePattern编码,可以减少内存管理模块的负载。
针对第7种信息,当Dalvik虚拟机的内存管理模块确定某个CyclePattern编码的命中率过低时,也可以不删除该CyclePattern编码,而是在该CyclePattern编码的CyclePattern_info数据结构中指示该CyclePattern编码为无效的,从而Dalvik虚拟机的内存管理模块不会使用该CyclePattern编码进行上述匹配过程。Dalvik虚拟机的内存管理模块可以周期性地删除无效的CyclePattern编码,例如,每周进行一次搜索过程,从而删除无效的CyclePattern编码,这样,可以避免处理器匹配无效的CyclePattern编码时造成的处理器资源的浪费。
S707、确定使用有效状态的引用环的信息进行垃圾回收后,未被回收的引用环的数量大于第二阈值,将无效状态的引用环的信息的状态恢复为有效状态。
具体来讲,由于应用程序在不同的运行状态时,例如,在启动过程、切换过程或者运行插件过程,所产生的引用环可能不同,因此,同一个引用环的信息并不能回收所有运行状态下的引用环。例如,在浏览器应用程序的启动过程的前10s中,第一引用环的信息的命中率内为10%,第二引用环的信息的命中率为3%,则Dalvik虚拟机的内存管理模块将第二引用环的信息设置为无效。然后,在浏览器应用程序处于切换过程中时,使用第一引用环的信息进行垃圾回收时,该垃圾对象的数量大于第二阈值,该阈值可以是技术人员根据实际使用需求设置的,在这种情况下,说明使用第一引用环的信息进行垃圾回收时无法实现较优的垃圾回收的效果,则Dalvik虚拟机的内存管理模块将可以将第二引用环的信息设置为有效,从而可以通过第二引用环的信息进行垃圾回收。
需要说明的是,步骤S705~步骤S707是可选步骤,即不是必须要执行的,在图15中以虚线表示。
在上述技术方案中,通过使用第一对象的第一引用环的信息,与该第一对象及至少一个第二对象的信息进行匹配的方式,实现对引用环的回收过程,可以避免由于引用环导致的内存资源浪费的问题,且在回收引用环中的对象时,计算设备只需要将实际对象的信息与引用环的信息进行匹配,计算量小,从而可以减少引用环的回收过程的计算开销。
上述本申请提供的实施例中,从计算设备的角度对本申请实施例提供的方法进行了介绍。为了实现上述本申请实施例提供的方法中的各功能,计算设备可以包括硬件结构和/或软件模块,以硬件结构、软件模块、或硬件结构加软件模块的形式来实现上述各功能。上述各功能中的某个功能以硬件结构、软件模块、还是硬件结构加软件模块的方式来执行,取决于技术方案的特定应用和设计约束条件。
图16示出了一种内存管理装置800的结构示意图。其中,内存管理装置1600可以是计算设备,能够实现本申请实施例提供的方法中计算设备的功能;内存管理装置1600也可以是能够支持计算设备实现本申请实施例提供的方法中计算设备的功能的装置。内存管理装置1600可以是硬件结构、软件模块、或硬件结构加软件模块。内存管理装置1600可以由芯片***实现。本申请实施例中,芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
内存管理装置1600可以包括处理模块1601和获取模块1602。
处理模块1601可以用于执行图7或图15所示的实施例中的步骤S701,和/或用于支持本文所描述的技术的其它过程。
获取模块1602可以用于执行图7所示的实施例中的步骤S702以及步骤S703,或用于执行图15所示的实施例中的步骤S702~步骤S707,和/或用于支持本文所描述的技术的其它过程。获取模块1602用于内存管理装置1600和其它模块进行通信,其可以是电路、器件、接口、总线、软件模块、收发器或者其它任意可以实现通信的装置。
其中,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
本申请实施例还提供一种内存管理装置,该内存管理装置可以是终端也可以是电路。该内存管理装置可以用于执行上述方法实施例中由计算设备所执行的动作。
以终端为手机为例,图17示出的是与本申请实施例相关的手机1700的部分结构的框图。参考图17,手机1700包括、射频(radio frequency,RF)电路1710、存储器1720、其他输入设备1730、显示屏1740、传感器1750、音频电路1760、I/O子***1770、处理器1780、以及电源1790等部件。本领域技术人员可以理解,图17中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。本领域技术人员可以理解显示屏1740属于用户界面(user interface,UI),且手机1700可以包括比图示或者更少的用户界面。
下面结合图17对手机1700的各个构成部件进行具体的介绍:
RF电路1710可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,给处理器1780处理;另外,将设计上行的数据发送给基站。通常,RF电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(low noiseamplifier,LNA)、双工器等。此外,RF电路1710还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯***(globalSystem of mobile communication,GSM)、通用分组无线服务(general packet radioservice,GPRS)、码分多址(code division multiple access,CDMA)、宽带码分多址(wideband code division multiple Access,WCDMA)、长期演进(long term evolution,LTE)、电子邮件、短消息服务(short messaging service,SMS)等。
存储器1720可用于存储计算机程序,诸如图17所示的应用程序和操作***;处理器可调用存储器存储的计算机程序,从而实现该计算机程序定义的功能。例如处理器执行操作***从而在手机1700上实现操作***的各种功能。操作***可以为或者其它操作***,本申请实施例对此不作任何限制。存储器1720可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序(比如声音播放功能、图象播放功能等)等;存储数据区可存储根据手机1700的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器1720可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
其他输入设备1730可用于接收输入的数字或字符信息,以及产生与手机1700的用户设置以及功能控制有关的键信号输入。具体地,其他输入设备1730可包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆、光鼠(光鼠是不显示可视输出的触摸敏感表面,或者是由触摸屏形成的触摸敏感表面的延伸)等中的一种或多种。其他输入设备1730与I/O子***1770的其他输入设备控制器1771相连接,在其他设备输入控制器1771的控制下与处理器1780进行信号交互。
显示屏1740可用于显示由用户输入的信息或提供给用户的信息以及手机1700的各种菜单,还可以接受用户输入。具体的显示屏1740可包括显示面板1741,以及触控面板1742。其中显示面板1741可以采用液晶显示器(liquid crystal display,LCD)、有机发光二极管(organic light-emitting diode,OLED)等形式来配置显示面板1741。触控面板1742,也称为触摸屏、触敏屏等,可收集用户在其上或附近的接触或者非接触操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板1742上或在触控面板1742附近的操作,也可以包括体感操作;该操作包括单点控制操作、多点控制操作等操作类型。),并根据预先设定的程式驱动相应的连接装置。可选的,触控面板1742可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位、姿势,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成处理器能够处理的信息,再送给处理器1780,并能接收处理器1780发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板1742,也可以采用未来发展的任何技术实现触控面板1742。进一步的,触控面板1742可覆盖显示面板1741,用户可以根据显示面板1741显示的内容(该显示内容包括但不限于,软键盘、虚拟鼠标、虚拟按键、图标等等),在显示面板1741上覆盖的触控面板1742上或者附近进行操作,触控面板1742检测到在其上或附近的操作后,通过I/O子***1770传送给处理器1780以确定用户输入,随后处理器1780根据用户输入通过I/O子***1770在显示面板1741上提供相应的视觉输出。虽然在图17中,触控面板1742与显示面板1741是作为两个独立的部件来实现手机1700的输入和输入功能,但是在某些实施例中,可以将触控面板1742与显示面板1741集成而实现手机1700的输入和输出功能。
手机1700还可包括至少一种传感器1750,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板1741的亮度,接近传感器可在手机1700移动到耳边时,关闭显示面板1741和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于手机1700还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路1760、扬声器1761,麦克风1762可提供用户与手机1700之间的音频接口。音频电路1760可将接收到的音频数据转换后的信号,传输到扬声器1761,由扬声器1761转换为声音信号输出;另一方面,麦克风1762将收集的声音信号转换为信号,由音频电路1760接收后转换为音频数据,再将音频数据输出至RF电路1710以发送给比如另一手机,或者将音频数据输出至存储器1720以便进一步处理。
I/O子***1770用来控制输入输出的外部设备,可以包括其他设备输入控制器1771、传感器控制器1772、显示控制器1773。可选的,一个或多个其他输入控制设备控制器1771从其他输入设备1730接收信号和/或者向其他输入设备1730发送信号,其他输入设备1730可以包括物理按钮(按压按钮、摇臂按钮等)、拨号盘、滑动开关、操纵杆、点击滚轮、光鼠(光鼠是不显示可视输出的触摸敏感表面,或者是由触摸屏形成的触摸敏感表面的延伸)。值得说明的是,其他输入控制设备控制器1771可以与任一个或者多个上述设备连接。所述I/O子***1770中的显示控制器1773从显示屏1740接收信号和/或者向显示屏1740发送信号。显示屏1740检测到用户输入后,显示控制器1773将检测到的用户输入转换为与显示在显示屏1740上的用户界面对象的交互,即实现人机交互。传感器控制器1772可以从一个或者多个传感器1750接收信号和/或者向一个或者多个传感器1750发送信号。
处理器1780是手机1700的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器1720内的软件程序和/或模块,以及调用存储在存储器1720内的数据,执行手机1700的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器1780可包括一个或多个处理单元;优选的,处理器1780可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器1780中。
手机1700还包括给各个部件供电的电源1790(比如电池),优选的,电源可以通过电源管理***与处理器1780逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗等功能。
尽管未示出,手机1700还可以包括摄像头、蓝牙模块等,在此不再赘述。
图16所示的实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,另外,在本申请各个实施例中的各功能模块可以集成在一个处理器中,也可以是单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
如图18所示为本申请实施例提供的内存管理装置1800,其中,内存管理装置1800可以是终端,能够实现本申请实施例提供的方法中终端的功能;内存管理装置1800也可以是能够支持终端实现本申请实施例提供的方法中终端的功能的装置。其中,该内存管理装置1800可以为芯片***。本申请实施例中,芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
内存管理装置1800包括至少一个处理器1820,用于实现或用于支持内存管理装置1800实现本申请实施例提供的方法中宿主基站的功能。示例性地,处理器1820可以在进行定位测量时,根据该第一信息,确定该小区组内小区发送的参考信号到达终端的符号边界是同步的,具体参见方法示例中的详细描述,此处不做赘述。
内存管理装置1800还可以包括至少一个存储器1830,用于存储程序指令和/或数据。存储器1830和处理器1820耦合。本申请实施例中的耦合是装置、单元或模块之间的间接耦合或通信连接,可以是电性,机械或其它的形式,用于装置、单元或模块之间的信息交互。处理器1820可能和存储器1830协同操作。处理器1820可能执行存储器1830中存储的程序指令。所述至少一个存储器中的至少一个可以包括于处理器中。
内存管理装置1800还可以包括通信接口1810,用于通过传输介质和其它设备进行通信,从而用于装置1800中的装置可以和其它设备进行通信。示例性地,该其它设备可以是终端。处理器1820可以利用通信接口1810收发数据。
本申请实施例中不限定上述通信接口1810、处理器1820以及存储器1830之间的具体连接介质。本申请实施例在图18中以存储器1830、处理器1820以及通信接口1810之间通过总线1840连接,总线在图18中以粗线表示,其它部件之间的连接方式,仅是进行示意性说明,并不引以为限。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图18中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请实施例中,处理器1820可以是通用处理器、数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
在本申请实施例中,存储器1830可以是非易失性存储器,比如硬盘(hard diskdrive,HDD)或固态硬盘(solid-state drive,SSD)等,还可以是易失性存储器(volatilememory),例如随机存取存储器(random-access memory,RAM)。存储器是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本申请实施例中的存储器还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
本申请实施例中还提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行图7或图14所示的实施例中计算设备执行的方法。
本申请实施例中还提供一种计算机程序产品,包括指令,当其在计算机上运行时,使得计算机执行图7或图14所示的实施例中计算设备执行的方法。
本申请实施例提供了一种芯片***,该芯片***包括处理器,还可以包括存储器,用于实现前述方法中计算设备的功能。该芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
本申请实施例提供的方法中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、网络设备、用户设备或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,简称DSL)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机可以存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,数字视频光盘(digital video disc,简称DVD))、或者半导体介质(例如,SSD)等。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (20)

1.一种内存管理方法,其特征在于,包括:
获取存储的第一引用环的信息,所述第一引用环为由多个对象形成的循环引用,所述第一引用环的信息包括所述第一引用环中的多个对象以及多个对象之间的引用关系;
确定存在第二引用环,所述第二引用环的信息与所述第一引用环的信息匹配,所述第二引用环的信息包括所述第二引用环中的多个对象以及多个对象之间的引用关系;
回收所述第二引用环中的多个对象所占用的内存。
2.根据权利要求1所述的方法,其特征在于,所述第一引用环的信息还包括所述第一引用环中每个对象在所述第一引用环中的引用计数值,所述第二引用环的信息还包括所述第二引用环中每个对象在所述第二引用环中的引用计数值;所述第二引用环的信息与所述第一引用环的信息匹配包括所述第二引用环中多个对象与所述第一引用环中的多个对象一一对应,且所述第二引用环中每个对象的引用计数值与所述第一引用环中对应的对象的引用计数值相等。
3.根据权利要求1或2所述的方法,其特征在于,所述第一引用环的信息包括被引用对象的标识,所述被引用对象的标识为所述被引用对象的存储地址,或为所述被引用对象存储地址相对于所述被引用对象的引用对象的存储地址的偏移量,或为所述被引用对象的名称。
4.根据权利要求1或2所述的方法,其特征在于,所述第一引用环的信息存储在第一对象的元数据中,所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
5.根据权利要求1或2所述的方法,其特征在于,在获取所述存储的第一引用环的信息之前,所述方法还包括:
获取应用程序在运行过程中产生的多个对象,所述多个对象中的任一对象为引用计数值大于0的对象;
根据所述多个对象中每个对象的信息,确定所述多个对象之间的引用关系,所述每个对象的信息包括所述每个对象引用的对象的标识;
根据所述多个对象之间的引用关系,生成并存储所述第一引用环的信息。
6.根据权利要求1或2所述的方法,其特征在于,确定任意一个对象的引用计数值小于或等于第一阈值,触发所述获取存储的第一引用环的信息的步骤,所述任意一个对象包含在所述第一引用环中。
7.根据权利要求6所述的方法,其特征在于,所述任意一个对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用第一对象的对象;所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象。
8.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
获取所述第一引用环中每个引用环的命中次数,所述命中次数用于表示回收所述第二引用环中的多个对象所占用内存的次数;
确定所述多个引用环中每个引用环的命中率,所述命中率为所述命中次数与执行所述内存管理方法的次数的比值;
删除所述命中率低于预设比值的所述第一引用环的信息或设置所述命中率低于预设比值的所述第一引用环的信息的状态为无效状态。
9.根据权利要求8所述的方法,其特征在于,在设置所述命中率低于预设比值的所述第一引用环的信息的状态为无效状态之后,所述方法还包括:
确定未被回收的对象的数量大于第二阈值,所述未被回收的对象的引用计数值大于0;
将无效状态的所述第一引用环的信息的状态恢复为有效状态。
10.一种内存管理装置,其特征在于,包括:
获取模块,用于获取存储的第一引用环的信息,所述第一引用环为由多个对象形成的循环引用,所述第一引用环的信息包括所述第一引用环中的多个对象以及多个对象之间的引用关系;
处理模块,用于确定存在第二引用环,所述第二引用环的信息与所述第一引用环的信息匹配,所述第二引用环的信息包括所述第二引用环中的多个对象以及多个对象之间的引用关系;回收所述第二引用环中的多个对象所占用的内存。
11.根据权利要求10所述的装置,其特征在于,
所述第一引用环的信息还包括所述第一引用环中每个对象在所述第一引用环中的引用计数值,所述第二引用环的信息还包括所述第二引用环中每个对象在所述第二引用环中的引用计数值;所述第二引用环的信息与所述第一引用环的信息匹配包括所述第二引用环中多个对象与所述第一引用环中的多个对象一一对应,且所述第二引用环中每个对象的引用计数值域所述第一引用环中对应的对象的引用计数值相等。
12.根据权利要求10或11所述的装置,其特征在于,所述第一引用环的信息包括被引用对象的标识,所述被引用对象的标识为所述被引用对象的存储地址,或为所述被引用对象存储地址相对于所述被引用对象的引用对象的存储地址的偏移量,或为所述被引用对象的名称。
13.根据权利要求10或11所述的装置,其特征在于,所述第一引用环的信息存储在第一对象的元数据中,所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用所述第一对象的对象。
14.根据权利要求10或11所述的装置,其特征在于,
所述获取模块还用于:获取应用程序在运行过程中产生的多个对象,所述多个对象中的任一对象为引用计数值大于0的对象;
所述处理模块还用于:根据所述多个对象中每个对象的信息,确定所述多个对象之间的引用关系,所述每个对象的信息包括所述每个对象引用的对象的标识;根据所述多个对象之间的引用关系,生成并存储所述第一引用环的信息。
15.根据权利要求10或11所述的装置,其特征在于,所述处理模块还用于:
确定任意一个对象的引用计数值小于或等于第一阈值,触发所述获取存储的第一引用环的信息的步骤,所述任意一个对象包含在所述第一引用环中。
16.根据权利要求15所述的装置,其特征在于,所述任意一个对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象,所述外部对象为所述第一引用环的多个对象之外引用第一对象的对象;所述第一对象为所述第一引用环的多个对象中最后一个被外部对象释放的对象。
17.根据权利要求10或11所述的装置,其特征在于,
所述获取模块还用于:获取所述第一引用环中每个引用环的命中次数,所述命中次数用于表示回收所述第二引用环中的多个对象所占用内存的次数;
所述处理模块还用于:确定所述多个引用环中每个引用环的命中率,所述命中率为所述命中次数与执行内存管理方法的次数的比值;
删除所述命中率低于预设比值的所述第一引用环的信息或设置所述命中率低于预设比值的所述第一引用环的信息的状态为无效状态。
18.根据权利要求17所述的装置,其特征在于,所述处理模块还用于:
确定未被回收的对象的数量大于第二阈值,所述未被回收的对象的引用计数值大于0;
将无效状态的所述第一引用环的信息的状态恢复为有效状态。
19.一种计算机存储介质,其特征在于,所述计算机存储介质中存储有计算机可执行指令,所述计算机可执行指令在被所述计算机调用时用于使所述计算机执行上述权利要求1-9中任一项所述的方法。
20.一种终端,其特征在于,所述终端包括处理器和存储器,所述存储器中存储有计算机可执行指令,所述计算机可执行指令在被所述处理器调用时用于使所述处理器执行上述权利要求1-9中任一项所述的方法。
CN201910229665.2A 2019-03-25 2019-03-25 一种内存管理方法及装置 Active CN111736980B (zh)

Priority Applications (4)

Application Number Priority Date Filing Date Title
CN201910229665.2A CN111736980B (zh) 2019-03-25 2019-03-25 一种内存管理方法及装置
EP20779864.6A EP3937016A4 (en) 2019-03-25 2020-01-15 MEMORY MANAGEMENT METHOD AND APPARATUS
PCT/CN2020/072325 WO2020192256A1 (zh) 2019-03-25 2020-01-15 一种内存管理方法及装置
US17/483,953 US20220012085A1 (en) 2019-03-25 2021-09-24 Memory management method and apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910229665.2A CN111736980B (zh) 2019-03-25 2019-03-25 一种内存管理方法及装置

Publications (2)

Publication Number Publication Date
CN111736980A CN111736980A (zh) 2020-10-02
CN111736980B true CN111736980B (zh) 2024-01-16

Family

ID=72610905

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910229665.2A Active CN111736980B (zh) 2019-03-25 2019-03-25 一种内存管理方法及装置

Country Status (4)

Country Link
US (1) US20220012085A1 (zh)
EP (1) EP3937016A4 (zh)
CN (1) CN111736980B (zh)
WO (1) WO2020192256A1 (zh)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111651277B (zh) * 2020-06-11 2024-03-26 深圳创维-Rgb电子有限公司 一种内存的清理方法、智能终端及可读存储介质
CN112463626B (zh) * 2020-12-10 2023-07-11 网易(杭州)网络有限公司 内存泄漏定位方法、装置、计算机设备及存储介质
CN112711629B (zh) * 2020-12-30 2022-10-21 浙江中控技术股份有限公司 数据及关联数据导入导出方法、装置、设备及存储介质
CN113296940B (zh) * 2021-03-31 2023-12-08 阿里巴巴新加坡控股有限公司 数据处理方法及装置
CN113407442B (zh) * 2021-05-27 2022-02-18 杭州电子科技大学 一种基于模式的Python代码内存泄漏检测方法
CN113553177B (zh) * 2021-07-14 2024-01-30 深圳市腾讯网域计算机网络有限公司 一种自动释放内存方法、装置、计算机设备和存储介质
CN115982060A (zh) * 2021-10-14 2023-04-18 华为技术有限公司 一种内存回收方法及相关装置
CN114896178B (zh) * 2022-05-20 2022-12-02 广东天太机器人有限公司 一种内存清空的方法及装置、设备和存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101046755A (zh) * 2006-03-28 2007-10-03 郭明南 一种计算机自动内存管理的***及方法
CN103226476A (zh) * 2013-05-20 2013-07-31 张永强 垃圾对象检测方法和装置

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7216136B2 (en) * 2000-12-11 2007-05-08 International Business Machines Corporation Concurrent collection of cyclic garbage in reference counting systems
US6879991B2 (en) * 2000-12-11 2005-04-12 International Business Machines Corporation Synchronous collection of cyclic garbage in reference counting systems
US8060543B1 (en) * 2005-04-29 2011-11-15 Micro Focus (Ip) Limited Tracking software object use
CN102929699B (zh) * 2012-10-10 2015-06-10 武汉钢铁(集团)公司 一种Java虚拟机的垃圾回收方法及其监测***
CN108804337A (zh) * 2017-05-04 2018-11-13 华为技术有限公司 内存垃圾回收的方法、装置及计算机存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101046755A (zh) * 2006-03-28 2007-10-03 郭明南 一种计算机自动内存管理的***及方法
CN103226476A (zh) * 2013-05-20 2013-07-31 张永强 垃圾对象检测方法和装置

Also Published As

Publication number Publication date
EP3937016A1 (en) 2022-01-12
WO2020192256A1 (zh) 2020-10-01
CN111736980A (zh) 2020-10-02
US20220012085A1 (en) 2022-01-13
EP3937016A4 (en) 2022-05-04

Similar Documents

Publication Publication Date Title
CN111736980B (zh) 一种内存管理方法及装置
CN109960507B (zh) 编译优化方法、装置、存储介质、智能终端及服务器
JP6870158B2 (ja) メモリを処理するための方法および装置ならびに記憶媒体
CN110888821B (zh) 一种内存管理方法及装置
US9589136B2 (en) Method and device for extracting message format
CN106502703B (zh) 一种函数调用方法和装置
US20150128079A1 (en) Method for executing function in response to touch input and electronic device implementing the same
WO2015007187A1 (en) Method, device and storage medium for providing data statistics
CN109062464B (zh) 触控操作方法、装置、存储介质和电子设备
CN108984095A (zh) 手势交互方法、装置、存储介质和电子设备
WO2019137252A1 (zh) 内存处理方法、电子设备、计算机可读存储介质
CN111427853A (zh) 一种数据加载方法和相关装置
CN112148579B (zh) 一种用户界面的测试方法和装置
CN111966491B (zh) 统计占用内存的方法及终端设备
EP3843356A1 (en) Management method for model files and terminal device
CN114205365B (zh) 应用界面迁移***、方法及相关设备
CN106713608A (zh) 应用的功能状态修改方法、装置及终端
CN110309100B (zh) 一种快照对象生成方法和装置
CN106502833A (zh) 数据备份方法及装置
US20170212962A1 (en) Apparatus and method for managing history information in an electronic device
WO2021254200A1 (zh) 操作***内存回收的页颠簸保护方法及装置
CN110245017B (zh) 资源标识的分配方法和设备
CN111274463B (zh) 基于im联系人分组设置的信息展示方法、装置及存储介质
CN106919458A (zh) Hook目标内核函数的方法及装置
CN111736839A (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