CN112100017B - 一种内存资源监控方法及装置 - Google Patents
一种内存资源监控方法及装置 Download PDFInfo
- Publication number
- CN112100017B CN112100017B CN201910522150.1A CN201910522150A CN112100017B CN 112100017 B CN112100017 B CN 112100017B CN 201910522150 A CN201910522150 A CN 201910522150A CN 112100017 B CN112100017 B CN 112100017B
- Authority
- CN
- China
- Prior art keywords
- function
- memory
- virtual memory
- application
- thread
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/3037—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5016—Allocation 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5022—Mechanisms to release resources
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种内存资源监控方法及装置,首先确定为应用对应的进程分配的虚拟内存池;若应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;监控目标线程在所述虚拟内存池占用的虚拟内存资源。可以理解的是,一个应用可能包括多个功能,可以通过监控功能占用的虚拟内存资源得到应用占用的内存资源。从而实现了监控应用占用的内存资源的目的。
Description
技术领域
本申请涉及计算机技术领域,更具体的说,是涉及一种内存资源监控方法及装置。
背景技术
电子设备内安装的应用越来越多,电子设备的内存资源愈发紧张,即便是为电子设备搭载更高容量的内存,随着电子设备运行时间加长,后台驻留应用越来越多,内存剩余量将不断减少,当有新应用要启动或切换时,申请内存的时间会越来越长。当内存剩余量达到一定比例时,很容易出现内存原因导致的整机运行卡顿。特别是在内存容量较小的移动设备上,内存原因导致的卡顿特别明显。
综上,若应用占用的内存资源较多,可能会导致电子设备出现卡顿的现象;或者,若应用占用的内存资源较多,可能需要对应用占用的内存资源进行清理释放,使得电子设备具有较多的内存剩余量,即具有较多的空闲内存资源。因此,如何监控应用占用的内存资源,以避免电子设备出现卡顿的情况,或者,释放占用内存资源较多的应用,成为了本领域技术人员需要考虑的问题。
发明内容
有鉴于此,本申请提供了一种内存资源监控方法及装置,以实现监控应用占用的内存资源的目的。
为实现上述目的,本申请提供如下技术方案:
第一方面,一种内存资源监控方法,包括:
确定为应用对应的进程分配的虚拟内存池;
若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
监控所述目标线程在所述虚拟内存池占用的虚拟内存资源。
第二方面,一种内存资源监控装置,包括:
第一确定模块,用于确定为应用对应的进程分配的虚拟内存池;
第二确定模块,用于若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
第一监控模块,用于监控所述目标线程在所述虚拟内存池占用的虚拟内存资源。
经由上述的技术方案可知,本申请提供的内存资源监控方法,首先确定为应用对应的进程分配的虚拟内存池;若应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;监控目标线程在所述虚拟内存池占用的虚拟内存资源。可以理解的是,一个应用可能包括多个功能,可以通过监控功能占用的虚拟内存资源得到应用占用的内存资源。从而实现了监控应用占用的内存资源的目的。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的内存资源监控原理示意图;
图2为本申请实施例提供的一种内存资源监控方法流程图;
图3为本申请实施例提供的一种内存资源监控装置结构示意图;
图4为本申请实施例提供的一种内存资源监控设备的硬件结构框图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
目前,若应用占用的内存资源较多,可能需要对应用占用的内存资源进行清理释放,使得电子设备具有较多的内存剩余量,即具有较多的空闲内存资源。目前对应用占用的内存资源进行清理释放,会导致应用终止运行,用户若需要再次使用该应用,则需要再次启动该应用。目前对应用占用的内存资源进行清理释放的方式包括但不限于FOOM(Foreground Out Of Memory)方式,FOOM是指应用在前台因占用的内存过多引起系统强制终止运行。对于用户而言,就是应用开启后闪退。
目前,若应用占用的内存资源较多,还可能导致电子设备出现卡顿的现象。为了避免应用占用过多的内存资源而被清理释放,或者,为了避免应用由于某个功能运行异常导致应用占用过多内存资源,导致电子设备出现卡顿的现象,本申请提供了一种能够监控应用中正在运行的功能占用的内存资源的方法和装置。通过监控各功能分别占用的内存资源,可以获知导致应用占用过多的内存资源的是哪个功能,后续可以对该功能进行改进,使得改进后的该功能不再占用过多的内存资源;或者,强制该功能退出,而不是整个应用退出。从而不会出现该应用由于占用过多的内存资源而被清理释放的现象,或者,导致电子设备出现卡顿的现象。
下面对本申请实施例提供的内存资源监控方法的实现原理进行说明。
如图1所示,为本申请实施例提供的内存资源监控原理示意图。
假设,电子设备包含应用11,在应用11中可以实现本申请实施例提供的内存资源监控方法。例如,本申请实施例提供的内存资源监控装置可以作为应用11中的一个插件。
下面从应用11启动开始,对本申请实施例提供的内存资源监控原理进行说明。
步骤1:若检测到应用11被启动,创建与应用11对应的进程12。
一个应用11对应一个进程,每个进程具有自己的进程标识。
在一可选实施例中,本申请实施例可以应用于具有IOS操作系统的电子设备。
假设应用11包括:功能1,……,功能N,其中,N为大于或等于1的正整数。
本申请实施例提及的应用11包含的功能是指,应用具有的功能模块或功能组件,例如,应用可以为即时通讯类应用,或,视频播放类应用,或,新闻类应用,或,支付类应用,或,漫画类应用,或,购物类应用等等。
以应用为即时通讯类应用为例,可选的,应用包含的功能可以包括以下至少一种:视频通讯功能、语音通讯功能、文字通讯功能以及查看朋友圈功能等等。
可以理解的是,应用11启动后并不是其包含的所有功能都处于运行状态。
步骤2:为进程12分配虚拟内存池13。
在一可选实施例中,可以利用vm_allocate函数为进程12分配虚拟内存池13。
在一可选实施例中,虚拟内存池13可以是以页的尺寸大小为单位的虚拟内存资源。
在一可选实施例中,vm_allocate函数的大致实现程序如下:
其中,vm_allocate函数中的标记位参数包括0x10。
可以理解的是,为进程分配的虚拟内存池13包含空闲的虚拟内存资源。即为进程12分配虚拟内存池13后,并不是虚拟内存池13中的所有虚拟内存资源都处于被占用状态,应用11包含的任一功能处于运行状态时,若需要占用虚拟内存资源,可以将虚拟内存池13中空闲的部分虚拟内存资源分配给该功能对应的线程。
步骤3:若应用11中第一功能被启动,创建与第一功能对应的目标线程。
假设功能1至功能N都被启动,则需要分别创建与之对应的线程。如图1所示,功能1对应的线程包括:线程1,……,线程M1;…,功能N对应的线程包括:线程1,……,线程ML。
其中,不同功能对应的线程数目可能相同,可能不同,因此,用M1,…,ML以示区分。一个功能对应一个或多个线程,即M1为大于或等于1的正整数,ML为大于或等于1的正整数。
假设上述第一功能为功能1,下面都以第一功能为功能1为例进行说明。若第一功能为功能1,那么目标线程包括线程1,…,线程M1。
在一可选实施例中,可以利用线程调用函数,例如,pthread_mach_thread_np(pthread_self()),获取第一功能对应的目标线程的线程标识。
可以理解的是,一个线程对应一个线程标识。
如图1所示,创建的功能1至功能N分别对应的线程都属于进程12。即一个进程可以包括一个或多个线程。
在一可选实施例中,在目标线程被创建后,若目标线程并不需要占用虚拟内存资源,那么不会为目标线程分配虚拟内存资源。在目标线程需要占用虚拟内存资源时,才会为目标线程分配虚拟内存资源。
步骤4:在第一功能运行过程中,为目标线程包含的一个或多个线程分配虚拟内存资源。
可选的,目标线程包括一个或多个线程,如图1所示,目标线程可以包括:线程1,…,线程M1。
在为目标线程分配虚拟内存资源的过程中,并不会同时为所有的线程1,…,线程M1分配虚拟内存资源,哪个线程需要占用虚拟内存资源才会为该线程分配虚拟内存资源。
在一可选实施例中,若为线程1,…,线程M1分别分配了虚拟内存资源,如图1所示,线程1占用虚拟内存资源1,…,线程M1占用虚拟内存资源M1。
如图1所示,可以看出,上述虚拟内存资源1至虚拟内存资源M1都属于虚拟内存池13。
在一可选实施例中,可以利用malloc函数针对目标线程在虚拟内存池13中分配虚拟内存资源。
在一可选实施例中,malloc函数大致实现程序如下:
其中,malloc函数中的标记位参数包括0x02。
步骤5:在第一功能运行过程中,释放目标线程包含的一个或多个线程对应的虚拟内存资源。
假设,步骤4中为目标线程包含的线程1、线程2、线程3以及线程4分别分配了虚拟内存资源1、虚拟内存资源2、虚拟内存资源3以及虚拟内存资源4。
可以理解的是,在第一功能运行过程中,第一功能占用的总的虚拟内存资源是动态变化的,不是固定不变的。例如,在第一功能运行过程中,可能会释放线程3对应的虚拟内存资源3;在第一功能继续运行的过程中,可能会再次为线程3分配虚拟内存资源。所以,在第一功能运行过程中,可能存在释放目标线程包含的某个线程对应的虚拟内存资源。
以应用11为微信应用为例,假设第一功能为视频通讯功能。
在视频通讯功能运行过程中(假设本地用户A利用电子设备与对端用户B进行通信)。
可以理解的是,电子设备需要采集本地用户A对应的图像,并传输至对端用户B所持的对端设备;电子设备需要接收对端用户B所持的对端设备采集的对端用户B对应的图像,并展示给本地用户A。
可以理解的是,电子设备不断的将本地用户A对应的图像进行采集并传输至对端用户B所持的对端设备;电子设备不断接收对端用户B所持的对端设备采集的对端用户B对应的图像。
假设,线程1对应的虚拟内存资源1用于执行电子设备不断的将本地用户A对应的图像进行采集并传输至对端用户B所持的对端设备对应的程序1;线程2对应的虚拟内存资源2用于执行电子设备不断接收对端用户B所持的对端设备采集的对端用户B对应的图像,并在电子设备显示对应的程序2。
那么,在视频通讯功能运行的过程中,线程1对应的虚拟内存资源1和线程2对应的虚拟内存资源2一直被占用。
可以理解的是,在视频通讯功能运行过程中,本地用户A和对端用户B可能间断的进行语音通讯。此时,电子设备需要采集本地用户A发出的语音并传输给对端用户B所持对端设备。电子设备需要接收对端用户B所持的对端设备采集的对端用户B发出的声音。
假设,线程3对应的虚拟内存资源3用于执行电子设备采集本地用户A发出的语音并传输给对端用户B所持对端设备对应的程序3;线程4对应的虚拟内存资源4用于执行电子设备接收对端用户B所持的对端设备采集的对端用户B发出的声音,并播放对端用户B的声音对应的程序4。
可以理解的是,本地用户A和对端用户B之间的语音通讯可能是间断的,即在线程3对应的虚拟内存资源3执行完毕程序3后,需要释放线程3占用的虚拟内存资源3;在线程4对应的虚拟内存资源执行完毕程序4后,需要释放线程4占用的虚拟内存资源4。
在一可选实施例中,释放线程3占用的虚拟内存资源3或者释放线程4占用的虚拟内存资源4后,并不释放线程3和线程4。即针对第一功能创建目标线程后,在第一功能运行结束之前,不会释放目标线程,在第一功能运行结束后,才会释放目标线程。
在一可选实施例中,释放线程3占用的虚拟内存资源3后,若本地用户A又与对端用户B进行语音通讯,那么,可能还会为线程3分配虚拟内存资源3(注意,不同时刻为线程3分配的虚拟内存资源3大小可能相同可能不同,虚拟内存资源3的地址可能相同,可能不同)。线程4同理,这里不再赘述。
在一可选实施例中,可以利用free函数或exist函数释放目标线程包含的一个或多个线程对应的虚拟内存资源。
在一可选实施例中,free函数大致实现程序如下:
其中,free函数中的标记位参数包含0x04。
图1中,仅以第一功能为功能1为例进行说明,所以虚拟内存池13只标出了功能1对应的线程占用的虚拟内存资源,即虚拟内存资源1至虚拟内存资源M1。
利用本申请提供的内存资源监控方法,可以获得步骤1针对应用11创建的进程12对应的进程标识,步骤2针对进程12分配的虚拟内存池13的地址和大小,步骤3创建的目标线程的线程标识,步骤4分配的虚拟内存资源的大小和地址,步骤5释放的虚拟内存资源的大小和地址。
本申请提供的内存资源监控方法,能够确定第一功能对应的目标线程,并能监控该第一功能对应的目标线程占用的虚拟内存资源。而目前的内存资源监控方法仅能监控应用对应的进程占用的总的虚拟内存资源(例如,利用task_info(mach_task_self(),…)函数获取应用对应的进程占用的总的虚拟内存资源),并不能监控应用包含的各个功能分别对应的线程占用的虚拟内存资源。
本申请提供的内存资源监控方法,能够确定为目标线程分配了多大的虚拟内存资源,释放了多大的虚拟内存资源。目前,仅能实现为线程分配或释放虚拟内存资源,但是并不知道是针对哪个功能对应的线程进行分配或释放虚拟内存资源。
步骤6:利用本申请实施例提供的内存资源监控方法,可以实时获得第一功能对应的目标线程占用的总的虚拟内存资源。
例如,目标线程包括线程1、线程2、线程3以及线程4。假设目标线程前一时刻占用的总的虚拟内存资源为total_size;若当前时刻,线程3占用的虚拟内存资源3被释放,那么当前时刻目标线程占用的总的虚拟内存资源为total_size=total_size-虚拟内存资源3的大小;若下一时刻,线程4被分配了虚拟内存资源4,那么下一时刻目标线程占用的总的虚拟内存资源为total_size=total_size+虚拟内存资源4的大小。
在一可选实施例中,可以以第一功能对应的目标线程占用的总的虚拟内存资源大小为纵坐标,以时间为横坐标,建立目标线程占用的总的虚拟内存资源大小与时间的关系曲线。
可选的,可以通过上述关系曲线得到第一功能在运行过程中对应的目标线程占用的总的虚拟内存资源的峰值。可选的,可以通过上述关系曲线,发现第一功能可能存在的问题。
在一可选实施例中,还包括:步骤7:若目标线程被释放(说明第一功能运行结束),本申请实施例提供的内存资源监控方法,还可以监控目标线程占用的总的虚拟内存资源是否被释放。
在一可选实施例中,若目标线程被释放,但目标线程占用的总的虚拟内存资源未被释放,则说明存在内存泄露事件。
在一可选实施例中,还包括步骤8:若进程12被释放(说明应用11运行结束),本申请实施例提供的内存资源监控方法,还可以监控进程12对应的虚拟内存池13是否被释放。
在一可选实施例中,若进程12被释放,但进程12对应的虚拟内存池未被释放,则说明存在内存泄露事件。
在一可选实施例中,可以通过vm_deallocate函数释放进程12对应的虚拟内存池。
在一可选实施例中,vm_deallocate函数大致实现程序如下:
其中,vm_deallocate函数中的标记位参数包含0x20。
在一可选实施例中,上述malloc函数与free函数(或exist函数)都包括malloc_logger指针;在一可选实施例中,vm_allocate函数与vm_deallocate函数都包括__syscall_logger指针。即malloc函数与free函数(或exist函数)共用malloc_logger指针;vm_allocate函数与vm_deallocate函数共用__syscall_logger指针。
在一可选实施例中,__syscall_logger指针与malloc_logger指针的类型相同,例如可以均为malloc_logger_t类型,在一可选实施例中,malloc_logger_t的定义如下:
typedf void(malloc_logger_t)(uint32_t type,uintptr_t arg1,uintptr_targ2,uintptr_t arg3,uintptr_t result,uint32_t num_hot_frames_to_skip)。
malloc_logger_t*malloc_logger;
malloc_logger_t*__syscall_logger。
下面结合图1所示的内存资源监控实现原理,下面对本申请实施例提供的内存资源监控方法进行说明。
如图2所示,为本申请实施例提供的内存资源监控方法的一种实现方式的流程图,该方法可以包括:
步骤S100、确定为应用对应的进程分配的虚拟内存池。
内存是与应用所在电子设备中的中央处理器(CentralProcessing Unit,CPU)进行沟通的桥梁。电子设备中所有程序的运行都是在内存中进行的,内存主要是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要电子设备在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,因此内存的使用状态也决定了电子设备的稳定运行。
在一可选实施例中,电子设备包含的应用对应的进程与分配的虚拟内存池可以一一对应,即电子设备包含的一个应用对应一个进程,并且该进程对应唯一的一个虚拟内存池,例如上述步骤1至步骤2所示的图1中,应用11对应进程12,且进程12对应唯一的虚拟内存池13。
步骤S110、若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程。
可以理解的是,应用启动后并不是该应用包含的所有功能都处于运行状态,例如以微信应用为例,该微信应用包含的功能至少可以包括:视频通讯功能、语音通讯功能、文字通讯功能以及查看朋友圈功能。启动微信应用后,可能仅部分基础功能处于运行状态,例如文字通讯功能处于运行状态,视频通讯功能、语音通讯功能以及查看朋友圈功能未处于运行状态。
上述未处于运行状态的功能被触发时可以启动,以处于运行状态,例如用户点击电子设备包含的微信应用中视频通讯功能对应的按键,则视频通讯功能被启动。
在一可选实施例中,应用包含的功能被启动,可以为其创建对应的线程。本步骤中,若应用中的第一功能被启动,可以确定第一功能对应的目标线程。在一可选实施例中,第一功能是指需要被监控的功能;相应的第一功能对应的目标线程是指需要被监控的线程。
例如,上述步骤3中,若应用11中功能1至功能N都被启动,则需要分别创建与之对应的线程。以第一功能为功能1为例,本步骤可以确定创建的与其对应的目标线程,在一可选实施例中,目标线程可以包括一个或多个线程,例如功能1对应的目标线程包括M1个线程。
在一可选实施例中,第一功能可以为一个应用启动时即处于运行状态的功能(例如文字通讯功能),和/或,一个应用启动后经触发处于运行状态的功能(例如视频通讯功能)。
步骤S120、监控所述目标线程在所述虚拟内存池占用的虚拟内存资源。
参见上述步骤4至步骤5,在第一功能运行过程中,若需要占用虚拟内存资源,则可以为目标线程包含的一个或多个线程分配虚拟内存资源;在第一功能运行过程中,还可以释放目标线程包含的一个或多个线程对应的虚拟内存资源。上述为目标线程包含的一个或多个线程分配、释放的虚拟内存资源都属于虚拟内存池13。
步骤S120中提及的所述目标线程在所述虚拟内存池占用的虚拟内存资源是指目标线程包含的一个或多个线程占用的总的虚拟内存资源。
在一可选实施例中,若应用包括多个功能,针对每一功能可以执行步骤S100至步骤S120的操作,从而可以获得应用包含的各功能对应的线程分别占用的总的虚拟内存资源,从而可以获得应用占用的总的内存资源。
本申请提供的内存资源监控方法,首先确定为应用对应的进程分配的虚拟内存池;若应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;监控目标线程在所述虚拟内存池占用的虚拟内存资源。可以理解的是,一个应用可能包括多个功能,可以通过监控功能占用的虚拟内存资源得到应用占用的内存资源。从而实现了监控应用占用的内存资源的目的。
可以理解的是,若要监控应用中第一功能占用虚拟内存池13的虚拟内存资源的情况,需要确定该第一功能对应哪个线程,进而可以对该线程进行监控。基于此,本申请的一个实施例上述步骤S110,若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程的过程进行介绍。
在一可选实施例中,上述步骤S110,若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程的过程具体可以包括:
S1、获取在所述第一功能被启动时,创建的第一线程。
可以参见上述实施例中步骤3介绍,这里不在赘述。
在一可选实施例中,在第一功能被启动的时刻,与第一功能对应的第一线程也会被创建,因此可以在第一功能被启动的时刻,获取创建的第一线程。该第一线程很大概率上与第一功能相对应,即可以将第一线程作为第一功能对应的目标线程。可选的,该第一线程可以是一个线程集合。例如,若第一功能为功能1,则基于功能1创建的第一线程可以包括:线程1,……,线程M1,即一个功能可以对应一个或多个线程。
S2、将所述第一线程确定为所述第一功能对应的所述目标线程。
在本实施例中,可以确定第一功能对应的目标线程,而目前的内存资源监控方法仅能确定应用对应的进程,以及该进程包含的一个或多个线程,并不能确定应用包含的功能具体对应哪个线程。
在一可选实施例中,电子设备包含的应用(例如应用11)可以包含一个或多个功能,但并不是所有功能都需要被监控,因此需要确定应用中被启动的功能是否属于被监控的功能,下面对此进行说明。
在一可选实施例中,确定应用(例如应用11)包含的被启动的一个或多个功能中哪个功能属于被监控的功能的过程具体可以包括:
S1、获取所述应用中被启动的至少一个功能。
可以理解的是,电子设备包含的一个应用被启动后,其包含的所有功能中至少一个功能处于被启动状态。
S2、将所述至少一个功能中属于预设的监控功能名单的功能,确定为所述第一功能。
可选的,可以预先建立监控功能名单,该监控功能名单包含的一个或多个需要被监控的功能的名单。
上述第一功能为监控功能名单中任一功能。
在一可选实施例中,上述监控功能名单的建立过程包括但不限于以下两种情况:
第一种,可以由开发人员预先建立监控功能名单,即开发人员凭借经验,将在占用虚拟内存资源的过程中有可能出现异常的功能移入监控功能名单中。
第二种,可以基于应用包含的各个功能占用虚拟内存资源的实际情况,建立监控功能名单,例如,将占用虚拟内存资源出现异常的功能移入监控功能名单中。
在一可选实施例中,功能对应的线程占用的虚拟内存资源出现异常的场景包括但不限于以下场景:
场景一,针对应用包含的至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源在设定时间内增大第一阈值,说明该功能对应的线程占用的虚拟内存资源出现异常,可以确定监控功能名单包括该功能对应的名称。
可以理解的是,针对应用中被启动的至少一个功能,若该功能对应的线程在设定时间内占用的虚拟内存池13中的虚拟内存资源增大一个较大值,则表征该功能可能出现异常。基于此,可选的,可以预先设置第一阈值,则若该功能对应的线程占用的虚拟内存资源在设定时间内增大该第一阈值,则可以将该功能移入监控功能名单,即监控功能名单包括该功能对应的名称。
例如,若预设的第一阈值是100兆,若微信应用的查看朋友圈功能被启动,监控到该功能对应的线程占用的虚拟内存资源在设定时间(例如1s)内增大500兆,表征该功能可能出现异常,因此可以将该查看朋友圈功能移入监控功能名单,即监控功能名单包括该查看朋友圈功能对应的名称。
在一可选实施例中,应用11包含的各个功能分别对应的第一阈值可以相同可以不同。
在一可选实施例中,可以通过步骤6中描述的“建立的目标线程占用的总的虚拟内存资源大小与时间的关系曲线”的方式,监控第一功能对应的目标线程占用的虚拟内存资源在设定时间内是否增大第一阈值。
场景二,针对应用包含的至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源的最大值大于第二阈值,确定所述监控功能名单包括该功能对应的名称。
可以理解的是,针对应用中被启动的任一个功能,若该功能对应的线程占用的虚拟内存资源的最大值大于某值,则表征该功能可能出现异常。可选的,可以预先设置第二阈值,则若该功能对应的线程占用的虚拟内存资源的最大值大于该第二阈值,则可以将该功能移入监控功能名单,即监控功能名单包括该功能对应的名称。
例如,若预设的第二阈值是500兆,若微信应用的查看朋友圈功能被启动,监控到该功能对应的线程占用的虚拟内存资源的最大值为550兆,表征该功能可能出现异常,因此可以将该查看朋友圈功能移入监控功能名单,即监控功能名单包括该查看朋友圈功能对应的名称。
在一可选实施例中,应用包含的各个功能分别对应的第二阈值可以相同可以不同。
在一可选实施例中,针对应用(例如应用11)包含的所有功能中任一功能,该功能在一次启动过程中,该功能对应的线程占用的虚拟内存资源是动态变化的,因此,可以获得一次启动过程中该功能对应的线程占用的最大虚拟内存资源;启动多次该功能,就可以得到多个最大虚拟内存资源。可选的第二阈值可以为多个最大虚拟内存资源中的最大值。例如,若5次启动微信应用中查看朋友圈功能,得到的5个最大虚拟内存资源分别是100兆、110兆、90兆、95兆、125兆,则第二阈值可以为125兆。
当然,上述预先设置的第二阈值仅为一种示例,除此之外,第二阈值还可以是其他数值,例如是多个最大虚拟内存资源的平均值或者加权平均值。
可以理解的是,本申请实施例提供的内存资源监控方法中,需要确定被启动的第一功能对应的目标线程;需要获得针对目标线程对应的虚拟内存资源的分配和释放情况。在一可选实施例中,可以通过钩子(Hook)函数获得上述信息。钩子函数具有与之相关联的一个或多个指针。该指针指向指定的,应用中定义的,被钩子函数中的子程序调用的预设回调函数。当目标线程被创建时,或者,针对目标线程对应的虚拟内存资源进行分配时,或者,针对目标线程对应的虚拟内存资源进行释放时,会传输给钩子函数中的子程序。从而使得预设回调函数也能获得这些信息。
下面详细说明利用钩子函数获得第一功能对应的目标线程的虚拟内存资源的分配和释放的过程。
在一可选实施例中,本申请实施例提供的内存资源监控方法可以对应预设回调函数。其中,预设回调函数通过第一钩子函数挂钩第一内存分配函数;预设回调函数通过第二钩子函数挂钩第一内存释放函数。
其中,第一内存分配函数用于在虚拟内存池13为第一功能对应的目标线程分配虚拟内存资源;第一内存释放函数用于将第一内存分配函数在虚拟内存池13为第一功能对应的目标线程分配的虚拟内存资源进行释放。
在一可选实施例中,预设回调函数可以通过第一钩子函数挂钩第一内存分配函数,从而若第一内存分配函数在虚拟内存池13为第一功能对应的目标线程分配虚拟内存资源时,可以通过第一钩子函数通知预设回调函数存在内存分配事件。
在一可选实施例中,预设回调函数可以通过第二钩子函数挂钩第一内存释放函数,从而若第一内存释放函数将第一功能对应的目标线程占用的虚拟内存资源进行释放时,可以通过第二钩子函数通知预设回调函数存在内存释放事件。
在一可选实施例中,挂钩第一内存分配函数以及第一内存释放函数的预设回调函数可以相同,也可以不同;在一可选实施例中,第一钩子函数和第二钩子函数可以相同,也可以不同。
在一可选实施例中,本申请提供的第一钩子函数可以包括第一内存分配函数中的第一指针,例如,若第一内存分配函数为malloc函数,第一指针可以为malloc_logger指针。
在一可选实施例中,本申请提供的第二钩子函数可以包括第一内存释放函数中的第二指针,例如,第一内存释放函数可以为free函数(或exist函数),第二指针可以为malloc_logger指针。
在一可选实施例中,本申请提供的第一钩子函数与所述第二钩子函数可以相同,如上述的malloc_logger指针,也即第一内存分配函数包含的第一指针与第一内存释放函数包含的第二指针相同。
在一可选实施例中,本申请所谓的第一指针与第二指针相同是指第一指针与第二指针具有相同名称且相同结构类型;在一可选实施例中,第一指针与第二指针指向的地址可以不同。
在一可选实施例中,本申请提供的第一钩子函数与第二钩子函数可以不相同。在一可选实施例中,本申请提供的第一钩子函数包含的第一指针与第一内存分配函数无关;在一可选实施例中,本申请提供的第二钩子函数包含的第二指针可以与第一内存释放函数无关。
若本申请实施例提供的第一钩子函数与第二钩子函数相同,即第一内存分配函数包含的第一指针与第一内存释放函数包含的第二指针相同,也即第一内存分配函数与第一内存释放函数共用同一个指针,且可以通过该共用的指针作为钩子函数与同一个预设回调函数挂钩,从而可以降低将预设回调函数的返回值传递给钩子函数时的出错率。
在一可选实施例中,本申请实施例提供的第一钩子函数与第一内存分配函数有关联,第二钩子函数与第一内存释放函数有关联,即第一钩子函数通过第一内存分配函数自身包含的指针挂钩第一内存分配函数,第二钩子函数通过第一内存释放函数自身包含的指针挂钩第一内存释放函数,从而可以更好地将预设回调函数分别与第一内存分配函数以及第一内存释放函数挂钩。
在一可选实施例中,可以基于参数传递的方式将上述预设回调函数分别与第一内存分配函数以及第一内存释放函数挂钩,以实现将预设回调函数(例如预设回调函数的名称为memory_event_callback)的返回值传递给钩子函数的目的。
假设,第一钩子函数包含的第一指针与第二钩子函数包含的第二指针相同,那么,例如通过参数传递的方式将memory_event_callback与malloc_logger指针挂钩:malloc_logger=memory_event_callback,从而实现了将上述预设回调函数分别与第一内存分配函数以及第一内存释放函数挂钩。
在一可选实施例中,可以基于预设回调函数获得目标线程在虚拟内存池13占用的虚拟内存资源,即上述步骤S120,监控所述目标线程在所述虚拟内存池占用的虚拟内存资源的过程具体可以包括:
S1、基于所述预设回调函数获得所述第一内存分配函数针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源。
参见前述步骤5中介绍,在第一功能运行过程中,第一功能占用的总的虚拟内存资源是动态变化的,不是固定不变的。即在第一功能运行过程中,可以在虚拟内存池13为第一功能对应的目标线程分配虚拟内存资源,还可以将分配的虚拟内存资源释放。
这里,第一虚拟内存资源是指基于第一内存分配函数为目标线程在虚拟内存池13中分配的总的虚拟内存资源。
S2、基于所述预设回调函数获得所述第一内存释放函数针对所述目标线程释放的第二虚拟内存资源。
在一可选实施例中,预设回调函数可以通过第二钩子函数挂钩第一内存释放函数,以得到基于第一内存释放函数释放的第二虚拟内存资源,即本步骤可以基于预设回调函数获得第一内存释放函数针对目标线程在虚拟内存池13中释放的第二虚拟内存资源。这里,第二虚拟内存资源是指基于第一内存释放函数释放的虚拟内存池13中总的虚拟内存资源。
在一可选实施例中,本步骤中第二虚拟内存资源是基于第一内存分配函数为目标线程分配的。
S3、监控所述第一虚拟内存资源与所述第二虚拟内存资源的差值,其中,所述差值为所述第一功能对应的目标线程占用的总的虚拟内存资源。
本实施例中,可以通过监控第一虚拟内存资源与第二虚拟内存资源的差值,得到目标线程在虚拟内存池13占用的虚拟内存资源。
可以理解的是,目标线程可以包括一个或多个线程。在一可选实施例中,目标线程可以包括线程1,…至线程M1,假设,线程1至线程4是指需要分配虚拟内存资源的线程,线程5至线程M1是指需要释放虚拟内存资源的线程。可以理解的是,将目标线程包括的线程1至线程4分别对应的虚拟内存资源相加可以得到第一虚拟内存资源;同理,将目标线程包括的线程5至线程M1分别对应的虚拟内存资源相加可以得到第二虚拟内存资源。因此,只要监控第一虚拟内存资源以及第二虚拟内存资源的差值,即可得到目标线程在虚拟内存池13占用的总的虚拟内存资源。
下面详细说明利用钩子函数获得针对应用对应的进程分配虚拟内存池的的过程。
在一可选实施例中,预设回调函数可以通过第三钩子函数挂钩第二内存分配函数,从而若第二内存分配函数为应用11对应的进程分配虚拟内存池13,则可以通过第三钩子函数通知预设回调函数存在内存分配事件。第二内存分配函数用于为应用11对应的进程12分配虚拟内存池13。
在一可选实施例中,可以基于预设回调函数获得应用对应的进程占用的虚拟内存池13,即上述步骤S100,确定为应用对应的进程分配的虚拟内存池的过程具体可以包括:
S1、若所述应用被启动,创建与所述应用对应的所述进程。
参见上述实施例中步骤1,若应用11被启动,则可以创建图1所示与该应用11对应的进程12。其中,一个应用11对应一个进程12。
S2、基于所述预设回调函数获得所述第二内存分配函数针对所述进程分配的所述虚拟内存池。
参见上述实施例中步骤2中介绍,在一可选实施例中,可以利用vm_allocate函数为进程12分配虚拟内存池13,这里的vm_allocate函数即为第二内存分配函数。
在一可选实施例中,本申请实施例提供的第三钩子函数可以包括第二内存分配函数中的第三指针。例如,第二内存分配函数为vm_allocate函数,第三指针可以为_syscall_logge指针。
下面详细说明利用钩子函数获得针对应用对应的进程占用的虚拟内存池和第一功能对应的目标线程占用的虚拟内存资源进行监控的过程。
可以理解的是,若应用11包含的第一功能运行结束,则释放第一功能对应的目标线程占用的虚拟内存资源,以及,若应用11运行结束,则释放应用11对应的进程12占用的虚拟内存池13,从而可以有效避免应用11对应的电子设备出现卡顿的情况。
在本申请实施例中,若应用11包含的第一功能运行结束,则可以监控第一功能对应的目标线程占用的虚拟内存资源是否被释放;若应用11运行结束,则可以监控应用11对应的进程12占用的虚拟内存池13是否被释放。下面分别对监控第一功能对应的目标线程占用的虚拟内存资源是否被释放的过程以及监控应用11对应的进程12占用的虚拟内存池13是否被释放的过程进行说明。
在一可选实施例中,钩子函数还可以包括第二钩子函数以及第四钩子函数。第二钩子函数的相关介绍详细可参照前述实施例介绍,这里不再详细赘述。本申请实施例中,预设回调函数可以通过第四钩子函数挂钩第二内存释放函数,从而若第二内存释放函数释放应用11对应的进程占用的虚拟内存池13,则可以通过第四钩子函数通知预设回调函数存在内存释放事件。第二内存释放函数用于释放应用11对应的进程12占用的虚拟内存池13。
基于上述介绍,在一可选实施例中,监控第一功能占用的虚拟内存资源是否被释放的过程具体可以包括:若应用11包含的第一功能运行结束,则可以释放第一功能对应的目标线程;进一步,参见上述实施例中步骤7,若第一功能对应的目标线程被释放,可以监控目标线程占用的总的虚拟内存资源是否被释放,即基于预设回调函数监控第一内存释放函数是否释放目标线程占用的虚拟内存资源。在一可选实施例中,若目标线程被释放,但目标线程占用的虚拟内存资源未被释放,则说明存在内存泄露事件。
在一可选实施例中,监控应用11占用的虚拟内存池13是否被释放的过程具体可以包括:若应用11运行结束,则可以释放应用11对应的进程12;进一步,仍参见上述实施例中步骤7,若应用11对应的进程12被释放,可以监控进程12占用的虚拟内存池是否被释放,即基于预设回调函数监控进程12对应的虚拟内存池13是否被释放。在一可选实施例中,若进程12被释放,但进程12对应的虚拟内存池13未被释放,则说明存在内存泄露事件。
在一可选实施例中,本申请提供的第四钩子函数可以包括第二内存释放函数中的第四指针。例如,第二内存释放函数为vm_deallocate函数,第四指针可以为_syscall_logge指针。
在一可选实施例中,本申请提供的第三钩子函数与第四钩子函数可以相同,也即第二内存分配函数包含的第三指针与第二内存释放函数包含的第四指针相同。
在一可选实施例中,本申请所谓的第三指针与第四指针相同是指第三指针与第四指针具有相同名称且相同结构类型;在一可选实施例中,第三指针与第四指针指向的地址可以不同。
在一可选实施例中,本申请提供的第三钩子函数与第四钩子函数可以不相同。在一可选实施例中,本申请提供的第三钩子函数包含的第三指针与第二内存分配函数无关;在一可选实施例中,本申请提供的第四钩子函数包含的第四指针可以与第二内存释放函数无关。
综上,本申请实施例提供的第三钩子函数与第二内存分配函数有关联,第四钩子函数与第二内存释放函数有关联,即第三钩子函数通过第二内存分配函数自身包含的指针挂钩第二内存分配函数,第四钩子函数通过第二内存释放函数自身包含的指针挂钩第二内存释放函数,从而可以更好地将预设回调函数分别与第二内存分配函数以及第二内存释放函数挂钩。
在一可选实施例中,可以基于参数传递的方式将上述预设回调函数分别与第二内存分配函数以及第二内存释放函数挂钩,以实现将预设回调函数的返回值传递给钩子函数的目的。
在一可选实施例中,若第三指针与第四指针相同,那么可以通过参数传递的过程将memory_event_callback与_syscall_logge指针挂钩:_syscall_logge=memory_event_callback,从而实现了上述预设回调函数分别与第二内存分配函数以及第二内存释放函数挂钩。
本申请实施例提供的第三钩子函数与第四钩子函数可以相同,即第二内存分配函数包含的第三指针与第二内存释放函数包含的第四指针相同,也即第二内存分配函数与第二内存释放函数共用同一个指针,且可以通过该共用的指针作为钩子函数与同一个预设回调函数挂钩,从而可以降低将预设回调函数的返回值传递给钩子函数时的出错率。
为了本领域技术人员更加理解本申请实施例提供的内存资源监控方法,下面以一具体例子对内存资源监控方法对应的一种可选代码实现方式进行说明。
假设目标线程占用的总的虚拟内存资源对应的变量为total_size,该变量total_size的定义可以如下:uint64_t total_size。
在一可选实施例中,假设第一功能在监控功能名单内,则可以将第一功能对应的目标线程包含的一个或多个线程分别对应的线程标识的集合赋值给target_thread_id,即变量target_thread_id可以包括目标线程中的一个或多个线程分别对应的标识,可选的,该变量target_thread_id的定义可以如下:mach_port_t target_thread_id。其中,可以利用线程调用函数,例如,pthread_mach_thread_np(pthread_self()),获取第一功能对应的目标线程的线程标识。
假设目标线程包括线程1和线程2,其中,线程1是待配虚拟内存资源的线程,线程2是待释放虚拟内存资源的线程。将线程1对应的线程标识和线程2对应的线程标识均赋值给变量target_thread_id。
在一可选实施例中,可以通过object_list函数获取目标线程的地址和目标线程占用的虚拟内存资源的大小,该object_list函数的定义可以如下:map<uint64_t,uint64_t>object_list。可选的,object_list函数至少包括两个参数:arg2以及return_val,其中,参数arg2在内存分配事件和内存释放事件表示的含义不同,在内存分配事件下,arg2用于表征针对线程1分配的虚拟内存资源的大小,return_val用于表示针对线程1分配的虚拟内存资源的地址;在内存释放事件下,arg2用于表征针对线程2释放的虚拟内存资源的地址。
在一可选实施例中,上述步骤S120,监控所述目标线程在所述虚拟内存池占用的虚拟内存资源的过程大致实现程序可以如下:
在一可选实施例中,可以将memory_event_callback函数作为预设回调函数,本申请实施例提供的内存资源监控方法可以是基于预设回调函数实现的,memory_event_callback函数对应的代码可以如下:
if(type_flags&0x02||type_flags&0x10){
针对“if(type_flags&0x02||type_flags&0x10)”的解释:type_flags的值是否包括第一内存分配函数中的标记位参数(例如0x02),或者,第二内存分配函数中标记位参数(例如0x10),或者,第一内存释放函数中的标记位参数(例如0x04),或者第二内存释放函数中的标记位参数(例如0x20),标记位用于指示是第一内存分配函数还是第二内存分配函数分配虚拟内存资源,或者,是第一内存释放函数还是第二内存释放函数释放虚拟内存资源,若type_flags的值包括0x02,则type_flags&0x02不为0,说明是基于第一内存分配函数,例如malloc函数为线程分配虚拟内存资源,若type_flags的值与包括0x10,则type_flags&0x10不为0,说明是基于第二内存分配函数,例如vm_allocate函数为应用对应的进程分配虚拟内存池;即判断是否为内存分配事件
if(pthread_mach_thread_np(pthread_self())==target_thread_id){
针对“if(pthread_mach_thread_np(pthread_self())==target_thread_id)”的解释:若pthread_mach_thread_np(pthread_self())获得上述内存分配事件针对的线程的线程标识为线程1的线程标识,表明当前的线程属于被监控的线程;
object_list[return_val]=arg2;
针对“object_list[return_val]=arg2”的解释:记录线程1占用的虚拟内存资源1的地址和虚拟内存资源1的大小
total_size+=arg2;
针对“total_size+=arg2”的解释:将线程1占用的虚拟内存资源1累加total_size,得到目标线程占用的总的虚拟内存资源
}
}
if(type_flags&0x04||type_flags&0x20){
针对“if(type_flags&0x04||type_flags&0x20)”解释:若type_flags的值包括0x04,则type_flags&0x04不为0,说明是基于第一内存释放函数,例如free函数或exist函数释放线程2占用的虚拟内存资源,若type_flags的值包括0x20,则type_flags&0x20不为0,说明是基于第二内存释放函数,例如vm_deallocate函数释放应用对应的进程占用的虚拟内存池;即判断是否为内存分配事件
if(object_list.exist(arg2)){
total_size-=object_list[arg2];
针对“total_size-=object_list[arg2]”的解释:从total_size减去线程2占用的虚拟内存资源2的大小,得到目标线程对应的总的虚拟内存资源
object_list.remove(arg2);
针对“object_list.remove(arg2)”的解释:移除线程2占用虚拟内存资源的记录,即线程2不在占用虚拟内存资源
}
}
…
}
综上,可以通过变量total_size监控目标线程在所述虚拟内存池占用的虚拟内存资源。若目标线程被释放后,total_size=0,说明目标线程占用的虚拟内存资源被释放,否则存在内存泄露事件。
上述本申请提供的实施例中详细描述了方法,对于本申请的方法可采用多种形式的装置实现,因此本申请还提供了几种装置,下面给出具体的实施例进行详细说明。
参见附图3,图3为本申请实施例提供的一种内存资源监控装置的结构示意图。
如图3所示,该装置可以包括:
第一确定模块31,用于确定为应用对应的进程分配的虚拟内存池;
第二确定模块32,用于若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
第一监控模块33,用于监控所述目标线程在所述虚拟内存池占用的虚拟内存资源。
在一可选实施例中,上述第二确定模块可以包括:
第一获取单元,用于获取在所述第一功能被启动时,创建的第一线程;
确定单元,用于将所述第一线程确定为所述第一功能对应的所述目标线程。
在一可选实施例中,本申请实施例公开的内存资源监控装置还可以包括:
获取模块,用于获取所述应用中被启动的至少一个功能;
第三确定模块,用于将所述至少一个功能中属于预设的监控功能名单的功能,确定为所述第一功能。
在一可选实施例中,本申请实施例公开的内存资源监控装置还可以包括以下至少一种:
第四确定模块,用于针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源在设定时间内增大第一阈值,确定所述监控功能名单包括该功能对应的名称;
第五确定模块,用于针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源的最大值大于第二阈值,确定所述监控功能名单包括该功能对应的名称。
在一可选实施例中,预设回调函数通过第一钩子函数挂钩第一内存分配函数;所述预设回调函数通过第二钩子函数挂钩第一内存释放函数;
上述第一监控模块可以包括:
第二获取单元,用于基于所述预设回调函数获得所述第一内存分配函数针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源;
第三获取单元,用于基于所述预设回调函数获得所述第一内存释放函数针对所述目标线程释放的第二虚拟内存资源;
监控单元,用于监控所述第一虚拟内存资源与所述第二虚拟内存资源的差值,其中,所述差值为所述虚拟内存资源。
在一可选实施例中,本申请实施例公开的内存资源监控装置可以包括以下至少一种:
所述第一钩子函数包括所述第一内存分配函数中的第一指针;
所述第二钩子函数包括所述第一内存释放函数中的第二指针;
所述第一钩子函数与所述第二钩子函数相同,所述第一内存分配函数包含的第一指针与所述第一内存释放函数包含的第二指针相同。
在一可选实施例中,预设回调函数通过第三钩子函数挂钩第二内存分配函数;
上述第一确定模块可以包括:
创建单元,用于若所述应用被启动,创建与所述应用对应的所述进程;
第四获取单元,用于基于所述预设回调函数获得所述第二内存分配函数针对所述进程分配的所述虚拟内存池。
在一可选实施例中,预设回调函数通过第二钩子函数挂钩第一内存释放函数;所述预设回调函数通过第四钩子函数挂钩第二内存释放函数;本申请实施例公开的内存资源监控装置还可以包括:
第二监控模块,用于若所述第一功能对应的所述目标线程被释放,基于所述预设回调函数监控所述第一内存释放函数是否释放所述目标线程占用的虚拟内存资源;
第三监控模块,用于若所述应用对应的进程被释放,基于所述预设回调函数监控所述第二内存释放函数是否释放所述进程占用的虚拟内存池。
在一可选实施例中,本申请实施例公开的内存资源监控装置可以包括以下至少一种:
所述第三钩子函数包括所述第二内存分配函数中的第三指针;
所述第四钩子函数包括所述第二内存释放函数中的第四指针;
所述第三钩子函数与所述第四钩子函数相同,且,所述第二内存分配函数包含的第三指针与所述第二内存释放函数包含的第四指针相同。
本申请实施例提供的内存资源监控装置可应用于内存资源监控设备。可选的,图4示出了内存资源监控设备的硬件结构框图,参照图4,内存资源监控设备的硬件结构可以包括:至少一个处理器41,至少一个通信接口42,至少一个存储器43和至少一个通信总线44;
在本申请实施例中,处理器41、通信接口42、存储器43、通信总线44的数量为至少一个,且处理器41、通信接口42、存储器43通过通信总线44完成相互间的通信;
处理器41可能是一个中央处理器CPU,或者是特定集成电路ASIC
(Application Specific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路等;
存储器43可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatilememory)等,例如至少一个磁盘存储器;
其中,存储器43存储有程序,处理器41可调用存储器43存储的程序,所述程序用于:
确定为应用对应的进程分配的虚拟内存池;
若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
监控所述目标线程在所述虚拟内存池占用的虚拟内存资源。
可选的,所述程序的细化功能和扩展功能可参照上文描述。
本申请实施例还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如上述内存资源监控方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置或系统类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (17)
1.一种内存资源监控方法,其特征在于,包括:
确定为应用对应的进程分配的虚拟内存池;
若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
基于预设回调函数获得第一内存分配函数针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源;
基于所述预设回调函数获得第一内存释放函数针对所述目标线程释放的第二虚拟内存资源;
监控所述第一虚拟内存资源与所述第二虚拟内存资源的差值,所述差值为所述目标线程在所述虚拟内存池占用的虚拟内存资源;
其中,所述预设回调函数通过第一钩子函数挂钩第一内存分配函数;所述预设回调函数通过第二钩子函数挂钩第一内存释放函数;若所述预设回调函数中的预设参数的值包括第一内存分配函数中的标记位参数,所述预设回调函数记录针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源的地址和大小;若所述预设回调函数中的预设参数的值包括第一内存释放函数中的标记位参数,所述预设回调函数移除针对所述目标线程占用虚拟内存资源的记录。
2.根据权利要求1所述内存资源监控方法,其特征在于,所述若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程,包括:
获取在所述第一功能被启动时,创建的第一线程;
将所述第一线程确定为所述第一功能对应的所述目标线程。
3.根据权利要求1所述内存资源监控方法,其特征在于,还包括:
获取所述应用中被启动的至少一个功能;
将所述至少一个功能中属于预设的监控功能名单的功能,确定为所述第一功能。
4.根据权利要求3所述内存资源监控方法,其特征在于,还包括以下至少一种:
针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源在设定时间内增大第一阈值,确定所述监控功能名单包括该功能对应的名称;
针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源的最大值大于第二阈值,确定所述监控功能名单包括该功能对应的名称。
5.根据权利要求1所述内存资源监控方法,其特征在于,包括以下至少一种:
所述第一钩子函数包括所述第一内存分配函数中的第一指针;
所述第二钩子函数包括所述第一内存释放函数中的第二指针;
所述第一钩子函数与所述第二钩子函数相同,所述第一内存分配函数包含的第一指针与所述第一内存释放函数包含的第二指针相同。
6.根据权利要求1所述内存资源监控方法,其特征在于,预设回调函数通过第三钩子函数挂钩第二内存分配函数;
所述确定为应用对应的进程分配的虚拟内存池包括:
若所述应用被启动,创建与所述应用对应的所述进程;
基于所述预设回调函数获得所述第二内存分配函数针对所述进程分配的所述虚拟内存池。
7.根据权利要求6所述内存资源监控方法,其特征在于,预设回调函数通过第二钩子函数挂钩第一内存释放函数;所述预设回调函数通过第四钩子函数挂钩第二内存释放函数;还包括:
若所述第一功能对应的所述目标线程被释放,基于所述预设回调函数监控所述第一内存释放函数是否释放所述目标线程占用的虚拟内存资源;
若所述应用对应的进程被释放,基于所述预设回调函数监控所述第二内存释放函数是否释放所述进程占用的虚拟内存池。
8.根据权利要求7所述内存资源监控方法,其特征在于,包括以下至少一种:
所述第三钩子函数包括所述第二内存分配函数中的第三指针;
所述第四钩子函数包括所述第二内存释放函数中的第四指针;
所述第三钩子函数与所述第四钩子函数相同,且,所述第二内存分配函数包含的第三指针与所述第二内存释放函数包含的第四指针相同。
9.一种内存资源监控装置,其特征在于,包括:
第一确定模块,用于确定为应用对应的进程分配的虚拟内存池;
第二确定模块,用于若所述应用中的第一功能被启动,确定所述进程包含的与所述第一功能对应的目标线程;
第二获取单元,用于基于预设回调函数获得第一内存分配函数针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源;
第三获取单元,用于基于所述预设回调函数获得第一内存释放函数针对所述目标线程释放的第二虚拟内存资源;
监控单元,用于监控所述第一虚拟内存资源与所述第二虚拟内存资源的差值,所述差值为所述目标线程在所述虚拟内存池占用的虚拟内存资源;
其中,所述预设回调函数通过第一钩子函数挂钩第一内存分配函数;所述预设回调函数通过第二钩子函数挂钩第一内存释放函数;若所述预设回调函数中的预设参数的值包括所述第一内存分配函数中的标记位参数,所述预设回调函数记录针对所述目标线程在所述虚拟内存池资源中分配的第一虚拟内存资源的地址和大小;若所述预设回调函数中的预设参数的值包括所述第一内存释放函数中的标记位参数,所述预设回调函数移除针对所述目标线程占用虚拟内存资源的记录。
10.如权利要求9所述内存资源监控装置,其特征在于,第二确定模块包括:
第一获取单元,用于获取在所述第一功能被启动时,创建的第一线程;
确定单元,用于将所述第一线程确定为所述第一功能对应的所述目标线程。
11.如权利要求9所述内存资源监控装置,其特征在于,还包括:
获取模块,用于获取所述应用中被启动的至少一个功能;
第三确定模块,用于将所述至少一个功能中属于预设的监控功能名单的功能,确定为所述第一功能。
12.如权利要求11所述内存资源监控装置,其特征在于,还包括:
第四确定模块,用于针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源在设定时间内增大第一阈值,确定所述监控功能名单包括该功能对应的名称;
第五确定模块,用于针对所述至少一个功能中任一功能,若该功能对应的线程占用的虚拟内存资源的最大值大于第二阈值,确定所述监控功能名单包括该功能对应的名称。
13.如权利要求9所述内存资源监控装置,其特征在于,
所述第一钩子函数包括所述第一内存分配函数中的第一指针;
所述第二钩子函数包括所述第一内存释放函数中的第二指针;
所述第一钩子函数与所述第二钩子函数相同,所述第一内存分配函数包含的第一指针与所述第一内存释放函数包含的第二指针相同。
14.如权利要求9所述内存资源监控装置,其特征在于,预设回调函数通过第三钩子函数挂钩第二内存分配函数;
所述第一确定模块包括:
创建单元,用于若所述应用被启动,创建与所述应用对应的所述进程;
第四获取单元,用于基于所述预设回调函数获得所述第二内存分配函数针对所述进程分配的所述虚拟内存池。
15.如权利要求14所述内存资源监控装置,其特征在于,
所述预设回调函数通过第四钩子函数挂钩第二内存释放函数;所述内存监控装置还包括:
若所述第一功能对应的所述目标线程被释放,基于所述预设回调函数监控所述第一内存释放函数是否释放所述目标线程占用的虚拟内存资源;
若所述应用对应的进程被释放,基于所述预设回调函数监控所述第二内存释放函数是否释放所述进程占用的虚拟内存池。
16.如权利要求15所述内存资源监控装置,其特征在于,
所述第三钩子函数包括所述第二内存分配函数中的第三指针;
所述第四钩子函数包括所述第二内存释放函数中的第四指针;
所述第三钩子函数与所述第四钩子函数相同,且,所述第二内存分配函数包含的第三指针与所述第二内存释放函数包含的第四指针相同。
17.一种内存资源监控设备,其特征在于,所述内存资源监控设备包括处理器和存储器;
其中,所述存储器存储有程序,所述处理器调用所述程序以执行如权利要求1-权利要求8任一项所述的内存资源监控方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910522150.1A CN112100017B (zh) | 2019-06-17 | 2019-06-17 | 一种内存资源监控方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910522150.1A CN112100017B (zh) | 2019-06-17 | 2019-06-17 | 一种内存资源监控方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112100017A CN112100017A (zh) | 2020-12-18 |
CN112100017B true CN112100017B (zh) | 2023-07-21 |
Family
ID=73748671
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910522150.1A Active CN112100017B (zh) | 2019-06-17 | 2019-06-17 | 一种内存资源监控方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112100017B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112817758A (zh) * | 2021-01-25 | 2021-05-18 | 山东众阳健康科技集团有限公司 | 一种资源消耗动态控制方法、系统、存储介质及设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101908018A (zh) * | 2010-07-20 | 2010-12-08 | 北京海泰方圆科技有限公司 | 一种判断内存泄露的系统及方法 |
US20120124018A1 (en) * | 2010-11-12 | 2012-05-17 | International Business Machines Corporation | Method, program, and system for processing object in computer |
CN103226486A (zh) * | 2013-04-23 | 2013-07-31 | 北京奇虎科技有限公司 | 对浏览器运行进行优化的方法和装置 |
CN104850460A (zh) * | 2015-06-02 | 2015-08-19 | 上海斐讯数据通信技术有限公司 | 一种服务程序线程管理方法 |
CN109150642A (zh) * | 2017-06-16 | 2019-01-04 | 腾讯科技(深圳)有限公司 | 应用内存错误检测方法、检测装置及存储介质 |
CN109471716A (zh) * | 2018-09-26 | 2019-03-15 | 努比亚技术有限公司 | 一种应用线程处理方法、终端及计算机可读存储介质 |
-
2019
- 2019-06-17 CN CN201910522150.1A patent/CN112100017B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101908018A (zh) * | 2010-07-20 | 2010-12-08 | 北京海泰方圆科技有限公司 | 一种判断内存泄露的系统及方法 |
US20120124018A1 (en) * | 2010-11-12 | 2012-05-17 | International Business Machines Corporation | Method, program, and system for processing object in computer |
CN103226486A (zh) * | 2013-04-23 | 2013-07-31 | 北京奇虎科技有限公司 | 对浏览器运行进行优化的方法和装置 |
CN104850460A (zh) * | 2015-06-02 | 2015-08-19 | 上海斐讯数据通信技术有限公司 | 一种服务程序线程管理方法 |
CN109150642A (zh) * | 2017-06-16 | 2019-01-04 | 腾讯科技(深圳)有限公司 | 应用内存错误检测方法、检测装置及存储介质 |
CN109471716A (zh) * | 2018-09-26 | 2019-03-15 | 努比亚技术有限公司 | 一种应用线程处理方法、终端及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112100017A (zh) | 2020-12-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109462726B (zh) | 摄像头的控制方法和装置 | |
CN108337333B (zh) | Ip地址管理方法、管理设备、网络录像机及存储介质 | |
CN102063338B (zh) | 一种请求独占资源的方法及装置 | |
US10002074B2 (en) | Non-intrusive storage of garbage collector-specific management data | |
CN108845877B (zh) | 管理内存的方法、装置和系统 | |
US20180188990A1 (en) | Method, apparatus and system for inserting disk | |
CN112087401B (zh) | 分布式存储中实现服务质量的方法和装置 | |
CN112214313A (zh) | 内存分配方法及相关设备 | |
CN112100017B (zh) | 一种内存资源监控方法及装置 | |
CN111464589A (zh) | 智能合约处理方法、计算机设备及存储介质 | |
CN106557404B (zh) | 一种应用控制的方法及移动终端 | |
CN109284275B (zh) | 一种云平台虚拟机文件系统监控方法和装置 | |
CN106021026B (zh) | 一种备份方法及装置 | |
CN109062781B (zh) | 一种报文缓冲区管理方法及装置 | |
CN106446158B (zh) | 应用数据的共享方法、共享装置和终端 | |
CN108334435A (zh) | 一种共享内存泄漏的提醒方法及装置 | |
CN110879748B (zh) | 一种共享资源分配方法、装置和设备 | |
CN116820748A (zh) | 一种密码卡会话资源管理方法及系统 | |
CN113691879B (zh) | 视频数据处理方法、电子设备、计算机可读存储介质 | |
CN114218126A (zh) | 内存回收方法和装置 | |
CN109725856B (zh) | 一种共享节点管理方法、装置、电子设备及存储介质 | |
CN108139969B (zh) | 一种内存配置方法、装置及系统 | |
CN114741218A (zh) | 操作系统的异常指标提取方法、装置、设备、系统及介质 | |
CN114157717A (zh) | 一种微服务动态限流的系统及方法 | |
CN110391952B (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 |