CN112131000B - 一种插件应用程序的内存释放方法及装置 - Google Patents
一种插件应用程序的内存释放方法及装置 Download PDFInfo
- Publication number
- CN112131000B CN112131000B CN202011010175.2A CN202011010175A CN112131000B CN 112131000 B CN112131000 B CN 112131000B CN 202011010175 A CN202011010175 A CN 202011010175A CN 112131000 B CN112131000 B CN 112131000B
- Authority
- CN
- China
- Prior art keywords
- plug
- source file
- class
- application program
- application
- 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
- 230000015654 memory Effects 0.000 title claims abstract description 145
- 238000000034 method Methods 0.000 title claims abstract description 52
- 230000007246 mechanism Effects 0.000 claims abstract description 40
- 230000003068 static effect Effects 0.000 claims description 24
- 238000005516 engineering process Methods 0.000 abstract description 5
- 230000008569 process Effects 0.000 description 14
- 238000010586 diagram Methods 0.000 description 12
- 238000004590 computer program Methods 0.000 description 7
- 238000001514 detection method Methods 0.000 description 7
- 238000004891 communication Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 230000003287 optical effect Effects 0.000 description 5
- 230000001960 triggered effect Effects 0.000 description 3
- 230000002457 bidirectional effect Effects 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 2
- 239000013307 optical fiber Substances 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 241000287219 Serinus canaria Species 0.000 description 1
- 230000001133 acceleration Effects 0.000 description 1
- 230000006978 adaptation Effects 0.000 description 1
- 230000004075 alteration Effects 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000010897 surface acoustic wave method Methods 0.000 description 1
Classifications
-
- 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)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请涉及计算机技术,特别涉及一种插件应用程序的内存释放方法及装置。用于及时回收释放插件应用程序占用的内存,该方法为:基于反射机制和用于加载插件应用程序的源文件的第一类加载器,获取到各个源文件,再按照各个源文件记录的内存释放方式,释放对应的源文件占用的内存,以及基于加载插件应用程序的类字节码文件的第二类加载器,在虚拟机中取消第二类加载器的各个关联方的引用关系,令操作系统自动释放类字节码文件占用的内存。这样,便实现了基于插件技术的内存释放方案,能够普遍应用于各类操作系统内的插件化场景中,从而在退出插件应用程序时,大大降低了宿主应用程序的崩溃机率,保证了宿主应用程序的运行性能。
Description
技术领域
本申请涉及计算机技术,特别涉及一种插件应用程序的内存释放方法及装置。
背景技术
相关技术下,为了对各类应用程序进行功能扩展,通常会在宿主应用程序中加载插件应用程序,称为插件化。
例如:以宿主应用程序是游戏程序为例,插件化是大型游戏的常用场景,通常可以在游戏程序中,通过启动直播插件和咨询插件,实现游戏直播和游戏咨询等等相关功能。
然而,在退出插件应用程序后,插件应用程序运行时产生的数据,往往会占用部分内存,称为残留内存,过多的残留内存会影响宿主应用程序的性能,因此需要及时退出。
为了解决残留内存的问题,最常用的解决方案就是多进程方案,即宿主应用程序和插件应用程序分别使用不同的运行进程,这样,插件应用程序产生的残留内存不会对宿主应用程序的运行产生影响。
然而,采用多进程方案却存在以下问题:插件应用程序的运行进程,会令宿主应用程序的运行进程转为后台进程,而宿主应用程序的运行进程往往占用较多内存(如,800M以上),因此,转为后台进程后,会大大增加宿主应用程序的运行进程被操作系统释放的概率,从而造成宿主应用程序的突然退出。
这样,会严重影响宿主应用程序的服务性能,因此需要一种插件应用程序的内存释放方法以克服上述缺陷。
发明内容
本申请实施例提供一种插件应用程序的内存释放方法,用以在退出插件应用程序时,能够及时释放插件应用程序占用的内存。
第一方面,一种插件应用程序的内存释放方法,包括:
基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,所述第一类加载器用于加载所述插件应用程序的源文件;
基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;
在虚拟机中释放第二类加载器加载的各个关联方的引用关系,其中,所述第二类加载器用于加载所述插件应用程序的类字节码文件,使得所述类字节码文件占用的内存被释放。
第二方面,一种插件应用程序的内存释放装置,包括:
确定单元,用于基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,所述第一类加载器用于加载所述插件应用程序的源文件;
第一释放单元,用于基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;
第二释放单元,用于在虚拟机中释放第二类加载器加载的各个关联方的引用关系,所述第二类加载器用于加载所述插件应用程序的类字节码文件,使得所述类字节码文件占用的内存被释放。
第三方面,一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于读取并执行所述存储器中存储的可执行指令,以实现第一方面所述的方法。
第四方面,一种计算机可读存储介质,当所述计算机可读存储介质中的指令由处理器执行时,使得所述处理器能够执行第一方面所述的方法。
第五方面,一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行第一方面所述的方法。
本申请实施例中,基于反射机制和用于加载插件应用程序的源文件的第一类加载器,获取到各个源文件,再按照各个源文件记录的内存释放方式,释放对应的源文件占用的内存,以及基于加载插件应用程序的类字节码文件的第二类加载器,在虚拟机中取消第二类加载器的各个关联方的引用关系,令操作系统自动释放类字节码文件占用的内存。这样,便实现了基于插件技术的内存释放方案,能够普遍应用于各类操作系统内的插件化场景中,从而在退出插件应用程序时,可以顺利释放因加载插件应用程序的源文件和类字节码文件而产生的残留内存,大大降低了宿主应用程序的崩溃机率,保证了宿主应用程序的运行性能。
附图说明
图1A为本申请实施例中残留内存示意图;
图1B为本申请实施例中应用场景架构示意图;
图1C为本申请实施例中退出插件应用程序的操作示意图;
图2A为本申请实施例中释放插件应用程序的残留内存流程示意图;
图2B为本申请实施例中游戏应用程序界面示意图;
图2C本申请实施例中直播应用程序界面示意图;
图3为本申请实施例中释放加载源文件占用的第一部分内存流程示意图;
图4为本申请实施例中源文件的访问路径的关联信息示意图;
图5A和图5B为本申请实施例中JVM中内存分布和引用关系示意图;
图6为本申请实施例中释放加载类字节码文件占用的第二部分内存流程示意图;
图7为本申请实施例中终端设备的逻辑架构示意图;
图8为本申请实施例中终端设备的实体架构示意图。
具体实施方式
为了使本申请的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
为便于对本申请实施例的理解,下面先对几个概念进行简单介绍:
宿主应用程序:是指加载并启动插件应用程序的主程序,插件应用程序的运行依赖宿主应用程序的运行。
插件应用程序:是指采用插件化技术将不同功能模块打包后形成的应用程序,宿主应用程序可以按照使用需求加载并启动对应功能的插件应用程序。
残留内存,是指在退出应用程序后,应用程序运行时产生的数据仍然占用的内存。
本申请实施例中,指退出插件应用程序后,插件应用程序运行时产生的数据仍然占用的内存。
可选的,参阅图1A所示,残留内存主要是基于以下两种方式产生的:
1、宿主应用程序使用Java虚拟机(Java Virtual Machine,JVM)通过第一类加载器(classloader)加载插件应用程序的源文件时,会通过建立内存文件映射(mmap)占用第一部分内存。
其中,源文件中记录有插件应用程序的源程序和相关数据。
2、宿主应用程序通过第二classloader加载插件应用程序的类字节码文件时,会占用第二部分内存。
其中,类字节码文件中记录有插件应用程序的源代码,用于描述插件应用程序的实现逻辑。
上述第一部分内存和第二部分内存无法通过操作系统自动释放,因此,便产生了残留内存。
为了解决顺利释放插件应用程序退出后产生的残留内存,本申请实施例中,需要分别释放加载插件应用程序的源文件产生的第一部分内存,和加载插件应用程序的类字节码文件产生的第二部分内存。
具体实施中,插件应用程序的源文件和类字节点码文件,分别由第一类加载器和第二类加载器加载,那么,可以基于Java反射机制,通过第一类加载器查找到插件应用程序的加载路径,进而获得插件应用程序包含的各个源文件,再按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;以及,可以在Java虚拟机中释放第二类加载器加载的各个关联方的引用关系,不被任何其他方引用也不引用任何其他方的对象会被操作系统自动释放,而当类字节码文件与其他方之间的引用关系被释放后,类字节码文件会被操作系统自动释放,从而类字节码文件占用的内存便会被释放。
下面结合附图对本申请优选的实施方式作出进一步详细说明。
参阅图1B所示,其为本申请实施例的应用场景示意图。在很多应用场景中,终端设备和服务器之间,通过通信网络通信,例如,以图1B所示的应用场景为例,假设在一个应用场景图中包括终端设备110和服务器120,终端设备110可以通过登录服务器120进入宿主应用程序的操作界面,终端设备110与服务器120之间可以通过通信网络进行通信。
在一种可选的实施方式中,通信网络是有线网络或无线网络。终端设备110以及服务器120可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
本申请实施例中,终端设备110为用户使用的电子设备,该电子设备可以是个人计算机、手机、平板电脑、笔记本、电子书阅读器等具有一定计算能力并且运行有宿主应用程序及插件应用程序的计算机设备。各终端设备110通过无线网络与服务器120连接,服务器120可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式操作系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。
本申请实施例中,用户通过终端设备110可登陆宿主应用程序的操作界面,终端设备110可响应用户在宿主应用程序的操作界面触发的各种操作。
参阅图1C所示,宿主应用程序的操作界面可以是游戏运行界面等等,在宿主应用程序的操作界面中,可以看到插件应用程序的运行标记,如,直播标记130。
当用户在宿主应用程序的操作界面中点击退出按钮时,会触发退出插件应用程序的操作,如,用户点击直播标记上方的X按钮,终端设备110的操作系统会在宿主应用程序的操作界面中退出插件应用程序,而退出插件应用程序之后,插件应用程序在运行过程中产生的数据仍然会占用部分内存,即会产生残留内存。
相较于相关技术下的多进程方案,本申请实施例中使用单进程方案,即宿主应用程序和插件应用程序使用同一运行进程,那么,宿主应用程序和插件应用程序必然会使用同一内存空间,而退出插件应用程序所产生的残留内存也必然会影响宿主应用程序的后续使用,因此,需要及时释放这部分残留内存。
本申请实施例中,为了释放残留内存,主要方式即是分别释放上述第一部分内存和第二部分内存,以释放相应的第一类加载器(第一classloader)和第二类加载器(第二classloader)。
参阅图2A所示,本申请实施例中,释放残留内存的示意流程如下:
步骤200:基于反射机制和第一classloader,确定插件应用程序的加载路径,第一classloader用于加载插件应用程序的源文件。
可选的,本申请实施例中,采用的反射机制是Java反射机制,后续实施例中均以此为例进行说明,将不再赘述。
步骤210:基于插件应用程序的加载路径,获得插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存。
步骤220:在虚拟机中释放第二classloader加载的各个关联方的引用关系,其中,第二classloader用于加载插件应用程序的类字节码文件,使得类字节码文件占用的内存被释放。
可选的,本申请实施例中,采用的虚拟机均为JVM,后续实施例中均以此为例,将不再赘述。
可选的,上述步骤200-步骤210为残留内存中第一部分内存的释放过程,而上述步骤220为残留内存中第二部分内存的释放过程,这两个释放过程之间,并没有严格的执行顺序限定,可并行也可串行,后续实施例中不再赘述。
例如,参阅图2B和图2C所示,在与图1C不同的另一个应用场景中,假设宿主应用程序为游戏应用程序,而插件应用程序为直播应用程序,那么,宿主应用程序的操作界面可以是游戏大厅界面,从游戏大厅界面中,可以启动直播应用程序并进入游戏直播间界面。
当直播结束后,用户在游戏直播间界面中点击退出按钮时,会触发退出直播应用程序的操作,而退出直播应用程序之后,直播应用程序在运行过程中产生的数据仍然会占用部分内存,即会产生残留内存。
后续实施例中,均以图2B和图2C所示的应用场景为例,介绍残留内存的释放过程,将不再赘述。
基于上述实施例,参阅图3所示,本申请实施例中,对应上述步骤200-步骤210,释放上述第一部分内存的详细流程如下:
步骤300:基于Java反射机制和用于加载插件应用程序的源文件的第一classloader,确定插件应用程序的加载路径。
Java反射机制是Java语言的重要特征之一,是一种间接操作目标对象的机制,其核心是:JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法和访问属性,不需要提前在编译期知道运行的对象。
具体的,在执行步骤300时,可以利用Java反射机制,先获取第一classloader的路径列表(pathList)属性,将路径列表属性中的私有属性设置为强制访问,从而通过访问私有属性获得插件应用程序的加载路径。
例如,以图2B和图2C所示的应用场景为例,假设基于Java反射机制和第一classloader,获得了直播应用程序的加载路径,记为:/data/user/0/com.tencent.gamehelper.smoba/app_tga_live_plugin/baseApk.apk。
步骤310:基于插件应用程序的加载路径,获得插件应用程序对应的源文件路径集合,源文件路径集合中记录有插件应用程序包含的各个源文件的访问路径。
例如,以图2B和图2C所示的应用场景为例,基于直播应用程序的加载路径,可以获得直播应用程序的源文件路径集合,记为:{/data/user/0/com.tencent.gamehelper.smoba/app_tga_live_plugin/baseApk.apk/classes.dex/data/user/0/com.tencent.gamehelper.smoba/app_tga_live_plugin/baseApk.apk/classes2.dex...}
其中,一个源文件的访问路径,可以记为:/data/user/0/com.tencent.gamehelper.smoba/app_tga_live_plugin/baseApk.apk/classes.dex。
步骤320:基于Java反射机制和源文件路径集合,获得插件应用程序包含的各个源文件,其中,一个源文件中记录有该源文件的内存释放方式。
参阅图4所示,在源文件路径集合中,记录有各个源文件的访问路径,而一个源文件的访问路径下记录有相应的源文件属性,一条源文件属性中记录有源文件信息(记为dexElements),在源文件信息中记录有相应的源文件(记为DexFile),而一个源文件中记录有该源文件的内存释放方式。
例如,以图2B和图2C所示的应用场景为例,假设基于直播应用程序的一个源文件的访问路径,获得了相应的源文件,而在这个源文件中,记录了相应的内存释放方法,具体为:调用源文件的colse方法。
步骤330:按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存。
例如,以图2B和图2C所示的应用场景为例,假设针对直播应用程序的一个源文件,可以通过调用该源文件的close方法,释放该源文件占用的内存。
上述过程仅以一个源文件为例进行说明,具体实施中,可以采用相同方式释放直播应用程序包含的各个源文件占用的内存,在此不再赘述。
这样,插件应用程序包含的各个源文件所占用的内存,便得到了释放,即图1A中的残留内存中的第一部分内存得到了释放。
上述实施例中介绍了释放第一部分内存的方法,下面介绍释放第二部分内存的方法。
在上述实施例中已介绍,第二部分内存是由于宿主应用程序通过第二classloader加载插件应用程序的类字节码文件而产生的。
参阅图5A所示,在加载类字节码文件后,JVM中的内存分配及引用关系如下:
在虚拟机栈中着存放指向堆的各个引用,分别记为MyClassloader引用和MyObject引用,其中,MyClassloader引用即为上述第二classloader,MyObject引用即为第二classloader的加载对象。
如图5A所示,在堆中会有一块专门划分的区域叫句柄池,句柄池保留了虚拟机栈中的各个引用产生的对象引用和类引用,其中,对象引用指向堆的数据区,类引用指向方法区。在方法区中,由MyObject引用产生的MyObject二进制数据占用的内存,即是第二classloader加载插件应用程序的类字节码文件而产生的第二部分内存。
实际应用中,MyObject引用的数量可以有多个,相应的,MyObject二进制数据的数量也可以有多个,图5A中仅以一个MyObject引用为例进行说明。
以MyObject引用为例,在JVM中,如果需要释放MyObject引用,只需要MyObject引用为空就能释放,而若MyObject引用为空,则需要释放所有相关对象。如图5A所示,MyObject二进制数据被MyObject classs引用所引用,而MyObject class引用又被MyClassloader对象引用所引用,进一步地,My Classloader对象引用又被MyClassloader引用和MyObject对象引用所引用,因此,若想释放MyObject引用,进而释放MyObject二进制数据占用的内存,就需要断开上述所有引用关系。
其中,需要释放MyClassloader是因为,在JVM中,类引用(如,MyObjectclass引用)都是通过类加载器加载(如,Myclassloader引用),每个类加载器持有一个类引用,因此,如果要释放掉一个类引用,就需要释放掉相关的类加载器(如,Myclassloader引用)。
例如,Myclassloader引用被释放后,MyClassloader对象引用才会被释放,而MyClassloader对象引用被释放后,MyObjectclass引用才会被释放,进而MyObject二进制数据占用的内存才会被释放。
经过上述分析,本申请实施例中,操作系统若要释放第二classloader加载插件应用程序的类字节码文件产生的第二部分内存,则需要满足三个条件:
1)第二classloader加载的目标对象没有内存泄漏。
参阅图5A所示,第二classloader加载的目标对象即是指MyObject引用(仅以一个MyObject引用为例)。
目标对象没有内存泄漏,即是指目标对象与任意其他方都不存在引用关系,如,没有引用任务其他方,也没有被任何其他方引用;以图5A为例,即MyObject引用需要释放掉Myobject class引用和MyObject对象引用。
2)第二classloader加载的类引用和对象引用被释放。
参阅图5A所示,第二classloader加载的类引用是指MyClassloaderclass引用和MyClassloader对象引用,这两部分需要被释放。
3)第二classloader加载的目标对象进一步加载的类引用没有被其他方引用。
参阅图5B所示,具体实施中,第二classloader可以会加载多个目标对象,如,MyObject1引用和MyObject2引用,这两个目标对象产生的MyObject1二进制数据和MyObject2二进制数据占用的内存,即是第二classloader加载插件应用程序的类字节码文件而产生的第二部分内存。
其中,一个目标对象加载的类引用也能被其他目标对象加载的对象数据引用,如图5B所示,My Object 1class引用被My Object 2对象数据所引用。
为了令My Object 1class能够被顺利释放,必须断开此类引用关系。
基于上述三个条件,参阅图6所示,本申请实施例中,对应上述步骤220,释放上述第二部分内存的详细流程如下:
步骤600:在JVM中针对用于加载插件应用程序的类字节码文件的第二classloader进行内存泄漏检测,确定第二classloader加载的目标对象与其他方存在引用关系时,取消该引用关系。
可选的,基于JVM垃圾释放原理,需要保证第二classloader加载的目标对象在JVM内的虚拟机栈中,没有被其他方引用,则可以采用检测工具LeakCanary或者Androidstudioprofiler检查内存泄漏,从而在插件应用程序退出的时候没有内存泄漏。
而一旦确定存在内存泄漏,即确定第二classloader加载的目标对象与其他方存在引用关系时,取消该引用关系。
具体包括:若第二classloader加载的目标对象与非静态类之间存在引用关系,则直接取消该引用关系;其中,与非静态类之间的引用关系,可以是双向引用,可以是单向引用,其中,单向引用,可以是引用非静态类,也可以是被非静态类引用。
若第二classloader加载的目标对象与静态类之间存在引用关系,则将静态类设置为空,其中,与静态类之间的引用关系,可以是双向引用,可以是单向引用,其中,单向引用,可以是引用静态类,也可以是被静态类引用。
例如:仍以图2B和图2C所示的应用场景为例,假设从游戏直播界面退出回到游戏大厅界面后,即退出了直播应用程序(即插件应用程序),那么,需要释放直播应用程序的类字节码文件,具体的,假设直播应用程序的类节字码文件,包括播放器的类字节码文件和播放器窗口的类字节码文件,而播放器的类字节码文件也会被播放器窗口的类字节码文件引用。
那么,参阅图5B所示,MyObject1引用即可以看作播放器的类字节码文件,MyObject2引用即可以看作播放器窗口的类字节码文件,而MyClassloader引用即可以看作是加载直播应用程序的第二MyClassloader。
因此,可以通过Java反射机制,获得第二MyClassloader加载的所有关联方之间的引用关系,即可以获得MyObject1引用和MyObject2引用所涉及到的所有引用关系。
在获得各个引用关系后,可以取消MyObject1引用和MyObject1class引用以及MyObject1对象引用之间的引用关系,以及取消MyObject2引用和My Object2class引用以及MyObject2对象引用之间的引用关系。
这样,My Object 1对象引用不再引用MyObject1引用,MyObject2class引用和MyObject 2对象不再引用MyObject2引用,则MyObject1对象引用、MyObject2class引用和MyObject2对象引用会被操作系统自动释放,由于My Object 2class引用被操作系统自动释放,则MyObject 2二进制数据占用的内存便会被释放,即播放器窗口的类字节码文件占用的内存得到了释放。
而MyObject1class引用暂时不会被操作系统自动释放,因为MyObject1class引用与MyObject2对象数据之间还存在引用关系,以及MyObject1class引用与MyClassloader对象引用之间存在引用关系。
步骤610:对第二classloader在JVM中加载的类引用和对象引用进行置空。
例如:仍以图2B和图2C所示的应用场景为例,参阅图5B所示,可以将MyClassloader引用加载的My Classloader class引用和MyClassloader对象引用进行置空。
这样,操作系统便能自动释放MyClassloaderclass引用和MyClassloader对象引用。
而MyObject1class引用仍然暂时不会被操作系统自动释放,因为,虽然随着MyClassloader对象引用的释放,MyObject1class引用与MyClassloader对象引用之间的引用关系已消失,但MyObject1class引用与MyObject2对象数据之间的引用关系还存在。
步骤620:对第二classloader加载的类字节码文件的进行静态代码检测,在静态代码中取消基于Java反射机制设置的引用关系。
例如,仍以图2B和图2C所示的应用场景为例,参阅图5B所示,MyObject1引用加载的MyObject1class引用,与MyObject2引用加载的MyObject2对象数据之间,存在基于Java反射机制设置的引用关系。
通过对类字节码文件的进行静态代码检测,可以检测出并取消上述基于Java反射机制设置的引用关系。
这样,MyObject1class引用与MyObject2对象数据之间的引用关系便会消失,此时,MyObject1class引用与其他方之间不再存在任何引用关系,则会被操作系统自动释放。
而在MyObject1class引用被操作系统自动释放后,My Object 1二进制数据占用的内存便会被释放,即播放器的类字节码文件占用的内存得到了释放。
那么,由于MyObject1二进制数据和MyObject2二进制数据占用的内存均被释放,则第二classloader加载插件应用程序的类字节码文件产生的第二部分内存也得到了释放,如,第二classloader加载直播应用程序的播放器的类字节码文件产生的内存,以及第二classloader加载直播应用程序的播放器窗口的类字节码文件产生的内存,均得到了释放。
这样,插件应用程序的类字节码文件占用的内存,便得到了释放,即图1A中的残留内存中的第二部分内存得到了释放。
基于上述各个实施例,至此,第二classloader加载插件应用程序的源文件产生的第一部分内存,以及第二类classloader加载插件应用程序的类字节码文件产生的第二部分内存,均得到了释放,那么,退出插件应用程序产生的残留内存便释放完毕,可以继续运行宿主应用程序。
例如,以图2B和图2C所示的应用场景为例,在退出直播应用程序之后,从游戏直播间界面回到游戏大厅界面,可以继续使用游戏应用程序执行其他操作。
基于同一发明构思,参阅图7所示,本申请实施例提供一种插件应用程序的内存释放装置(如,终端设备),至少包括确定单元70,第一释放单元71和第二释放单元72,其中,
确定单元70,用于基于反射机制和第一类加载器,确定插件应用程序的加载路径,第一类加载器用于加载插件应用程序的源文件;
第一释放单元71,用于基于插件应用程序的加载路径,获得插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;
第二释放单元73,用于在虚拟机中释放第二类加载器加载的各个关联方的引用关系,第二类加载器用于加载插件应用程序的类字节码文件,使得类字节码文件占用的内存被释放。
可选的,基于反射机制和第一类加载器,确定插件应用程序的加载路径,确定单元70用于:
基于反射机制,获取第一类加载器的路径列表属性;
将所述路径列表属性中的私有属性设置为强制访问;
访问私有属性,获取插件应用程序的加载路径。
可选的,基于插件应用程序的加载路径,获得插件应用程序包含的各个源文件,第一释放单元71用于:
基于插件应用程序的加载路径,获得插件应用程序对应的源文件路径集合,源文件路径集合中记录有插件应用程序包含的各个源文件的访问路径;
基于反射机制和源文件路径集合,获得插件应用程序包含的各个源文件。
可选的,基于反射机制和源文件路径集合,获得插件应用程序包含的各个源文件,第一释放单元71用于:
基于反射机制和源文件路径集合记录的各个源文件的访问路径,获得各个源文件的源文件属性;
基于获得的各个源文件属性,获得相应的源文件信息;
在获得的各个源文件信息中,获得相应的源文件。
可选的,在虚拟机中释放第二类加载器加载的各个关联方的引用关系,第二释放单元72用于:
在虚拟机中取消第二类加载器加载的目标对象与其他方之间的引用关系;
对第二类加载器在虚拟机中加载的类引用和对象引用进行置空;
在第二类加载器加载的类字节码文件的静态代码中,取消基于反射机制设置的引用关系。
可选的,在虚拟机中取消第二类加载器加载的目标对象与其他方之间的引用关系,第二释放单元72用于:
若第二类加载器加载的目标对象与非静态类之间存在引用关系,则直接取消引用关系;
若第二类加载器加载的目标对象与静态类之间存在引用关系,则将静态类设置为空。
基于同一发明构思,参阅图8所示,本申请实施例还提供了一种终端设备800,该终端设备800可以为智能手机、平板电脑,手提电脑或PC机等电子设备。如图8所示,终端设备800包括显示单元840、处理器880以及存储器820,其中,显示单元840包括显示面板841,用于显示由用户输入的信息或提供给用户的信息以及终端设备800的各种对象选择页面等,在本申请实施例中主要用于显示终端设备800中已安装的应用的页面、快捷窗口等。可选的,可以采用液晶显示器(Liquid Crystal Display,LCD)或有机发光二极管(OrganicLight-Emitting Diode,OLED)等形式来配置显示面板841。
处理器880用于读取计算机程序,然后执行计算机程序定义的方法,例如处理器880读取社交应用程序,从而在该终端设备800上运行应用,在显示单元840上显示应用的页面。处理器880可以包括一个或多个通用处理器,还可包括一个或多个数字信号处理器(Digital Signal Processor,DSP),用于执行相关操作,以实现本申请实施例所提供的技术方案。
存储器820一般包括内存和外存,内存可以为随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)等。外存可以为硬盘、光盘、USB盘、软盘或磁带机等。存储器820用于存储计算机程序和其他数据,该计算机程序包括应用对应的应用程序等,其他数据可包括操作系统或应用程序被运行后产生的数据,该数据包括操作系统数据(例如操作系统的配置参数)和用户数据。本申请实施例中程序指令存储在存储器820中,处理器880执行存储在存储器820中的程序指令,实现前文论述的音频节目内容的文稿显示控制方法,或者实现前文论述的适配应用的功能。
此外,终端设备800还可以包括显示单元840,用于接收输入的数字信息、字符信息或接触式触摸操作/非接触式手势,以及产生与终端设备800的用户设置以及功能控制有关的信号输入等。具体地,本申请实施例中,该显示单元840可以包括显示面板841。显示面板841例如触摸屏,可收集用户在其上或附近的触摸操作(比如玩家使用手指、触笔等任何适合的物体或附件在显示面板841上或在显示面板841的操作),并根据预先设定的程式驱动对应的连接装置。可选的,显示面板841可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器880,并能接收处理器880发来的命令并加以执行。
其中,显示面板841可以采用电阻式、电容式、红外线以及表面声波等多种类型实现。除了显示单元840,终端设备800还可以包括输入单元830,输入单元830可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。图8中是以输入单元830包括图像输入设备831和其它输入设备832为例。
除以上之外,终端设备800还可以包括用于给其他模块供电的电源890、音频电路860、近场通信模块870和RF电路810。终端设备800还可以包括一个或多个传感器850,例如加速度传感器、光传感器、压力传感器等。音频电路860具体包括扬声器861和麦克风862等,例如用户可以使用语音控制,终端设备800可以通过麦克风862采集用户的声音,可以用户的声音进行控制,并在需要提示用户时,通过扬声器861播放对应的提示音。
基于同一发明构思,本申请实施例提供了一种计算机可读介质,当所述计算机可读存储介质中的指令由处理器执行时,使得所述处理器能够执行如上述各个实施例中终端设备执行的任意一种方法。
可选地,计算机可读介质可以是非临时性计算机可读存储介质,例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等等。
基于同一发明构思,本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述实施例中介绍的任意一种方法。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读信号介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的操作系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
本申请的实施方式的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在计算装置上运行。然而,本申请的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被命令执行操作系统、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由命令执行操作系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (12)
1.一种插件应用程序的内存释放方法,其特征在于,包括:
基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,所述第一类加载器用于加载所述插件应用程序的源文件;
基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;
在虚拟机中释放第二类加载器加载的各个关联方的引用关系,其中,所述第二类加载器用于加载所述插件应用程序的类字节码文件,使得所述类字节码文件占用的内存被释放;
其中,在虚拟机中释放第二类加载器加载的各个关联方的引用关系,包括:
在虚拟机中取消所述第二类加载器加载的目标对象与其他方之间的引用关系;对所述第二类加载器在虚拟机中加载的类引用和对象引用进行置空;在所述第二类加载器加载的类字节码文件的静态代码中,取消基于反射机制设置的引用关系。
2.如权利要求1所述的方法,其特征在于,基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,包括:
基于反射机制,获取所述第一类加载器的路径列表属性;
将所述路径列表属性中的私有属性设置为强制访问;
访问所述私有属性,获取所述插件应用程序的加载路径。
3.如权利要求1所述的方法,其特征在于,基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,包括:
基于所述插件应用程序的加载路径,获得所述插件应用程序对应的源文件路径集合,所述源文件路径集合中记录有所述插件应用程序包含的各个源文件的访问路径;
基于反射机制和所述源文件路径集合,获得所述插件应用程序包含的各个源文件。
4.如权利要求3所述的方法,其特征在于,基于反射机制和所述源文件路径集合,获得所述插件应用程序包含的各个源文件,包括:
基于反射机制和所述源文件路径集合记录的各个源文件的访问路径,获得所述各个源文件的源文件属性;
基于获得的各个源文件属性,获得相应的源文件信息;
在获得的各个源文件信息中,获得相应的源文件。
5.如权利要求1-4任一项所述的方法,其特征在于,在虚拟机中取消所述第二类加载器加载的目标对象与其他方之间的引用关系,包括:
若所述第二类加载器加载的目标对象与非静态类之间存在引用关系,则直接取消所述引用关系;
若所述第二类加载器加载的目标对象与静态类之间存在引用关系,则将所述静态类设置为空。
6.一种插件应用程序的内存释放装置,其特征在于,包括:
确定单元,用于基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,所述第一类加载器用于加载所述插件应用程序的源文件;
第一释放单元,用于基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,按照各个源文件中记录的内存释放方式,分别释放对应的源文件占用的内存;
第二释放单元,用于在虚拟机中释放第二类加载器加载的各个关联方的引用关系,所述第二类加载器用于加载所述插件应用程序的类字节码文件,使得所述类字节码文件占用的内存被释放;
在虚拟机中释放第二类加载器加载的各个关联方的引用关系,所述第二释放单元用于:在虚拟机中取消所述第二类加载器加载的目标对象与其他方之间的引用关系;对所述第二类加载器在虚拟机中加载的类引用和对象引用进行置空;在所述第二类加载器加载的类字节码文件的静态代码中,取消基于反射机制设置的引用关系。
7.如权利要求6所述的装置,其特征在于,基于反射机制和第一类加载器,确定所述插件应用程序的加载路径,所述确定单元用于:
基于反射机制,获取所述第一类加载器的路径列表属性;
将所述路径列表属性中的私有属性设置为强制访问;
访问所述私有属性,获取所述插件应用程序的加载路径。
8.如权利要求6所述的装置,其特征在于,基于所述插件应用程序的加载路径,获得所述插件应用程序包含的各个源文件,所述第一释放单元用于:
基于所述插件应用程序的加载路径,获得所述插件应用程序对应的源文件路径集合,所述源文件路径集合中记录有所述插件应用程序包含的各个源文件的访问路径;
基于反射机制和所述源文件路径集合,获得所述插件应用程序包含的各个源文件。
9.如权利要求8所述的装置,其特征在于,基于反射机制和所述源文件路径集合,获得所述插件应用程序包含的各个源文件,所述第一释放单元用于:
基于反射机制和所述源文件路径集合记录的各个源文件的访问路径,获得所述各个源文件的源文件属性;
基于获得的各个源文件属性,获得相应的源文件信息;
在获得的各个源文件信息中,获得相应的源文件。
10.如权利要求6-9任一项所述的装置,其特征在于,在虚拟机中取消所述第二类加载器加载的目标对象与其他方之间的引用关系,所述第二释放单元用于:
若所述第二类加载器加载的目标对象与非静态类之间存在引用关系,则直接取消所述引用关系;
若所述第二类加载器加载的目标对象与静态类之间存在引用关系,则将所述静态类设置为空。
11.一种电子设备,其特征在于,包括:
存储器,用于存储可执行指令;
处理器,用于读取并执行所述存储器中存储的可执行指令,以实现如权利要求1-5任一项所述的方法。
12.一种计算机可读存储介质,其特征在于,当所述计算机可读存储介质中的指令由处理器执行时,使得所述处理器能够执行如权利要求1-5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011010175.2A CN112131000B (zh) | 2020-09-23 | 2020-09-23 | 一种插件应用程序的内存释放方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011010175.2A CN112131000B (zh) | 2020-09-23 | 2020-09-23 | 一种插件应用程序的内存释放方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112131000A CN112131000A (zh) | 2020-12-25 |
CN112131000B true CN112131000B (zh) | 2024-02-06 |
Family
ID=73841626
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011010175.2A Active CN112131000B (zh) | 2020-09-23 | 2020-09-23 | 一种插件应用程序的内存释放方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112131000B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6446254B1 (en) * | 1999-03-30 | 2002-09-03 | International Business Machines Corporation | Packaging memory image files |
CN102722432A (zh) * | 2011-03-29 | 2012-10-10 | 国际商业机器公司 | 追踪内存访问的方法和装置 |
CN102880456A (zh) * | 2012-07-31 | 2013-01-16 | 北京奇虎科技有限公司 | 一种创建插件方法及装置 |
CN105740033A (zh) * | 2016-03-15 | 2016-07-06 | 广州彩瞳网络技术有限公司 | 一种终端设备、插件加载运行装置及插件加载运行方法 |
CN106933611A (zh) * | 2015-12-31 | 2017-07-07 | 北京五八信息技术有限公司 | 类加载方法及类加载器 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070156913A1 (en) * | 2005-12-30 | 2007-07-05 | Hiroyuki Miyamoto | Method for enabling extension points through plug-ins |
US20090125611A1 (en) * | 2007-11-08 | 2009-05-14 | Barsness Eric L | Sharing loaded java classes among a plurality of nodes |
US8843912B2 (en) * | 2012-02-20 | 2014-09-23 | International Business Machines Corporation | Optimization of an application to reduce local memory usage |
-
2020
- 2020-09-23 CN CN202011010175.2A patent/CN112131000B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6446254B1 (en) * | 1999-03-30 | 2002-09-03 | International Business Machines Corporation | Packaging memory image files |
CN102722432A (zh) * | 2011-03-29 | 2012-10-10 | 国际商业机器公司 | 追踪内存访问的方法和装置 |
CN102880456A (zh) * | 2012-07-31 | 2013-01-16 | 北京奇虎科技有限公司 | 一种创建插件方法及装置 |
CN106933611A (zh) * | 2015-12-31 | 2017-07-07 | 北京五八信息技术有限公司 | 类加载方法及类加载器 |
CN105740033A (zh) * | 2016-03-15 | 2016-07-06 | 广州彩瞳网络技术有限公司 | 一种终端设备、插件加载运行装置及插件加载运行方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112131000A (zh) | 2020-12-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103984538B (zh) | 应用场景的识别方法、功耗管理方法、装置及终端设备 | |
CN113110941B (zh) | 使用应用容器管理代码和依赖性数据的传递 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN111736980B (zh) | 一种内存管理方法及装置 | |
CN108595218B (zh) | 一种加载系统动态库的方法和装置 | |
WO2018036505A1 (zh) | 一种终端后台应用程序的管理方法及装置 | |
CN110168496B (zh) | 用于应用呈现的方法和系统 | |
US20150169874A1 (en) | Method, device, and system for identifying script virus | |
CN113342697B (zh) | 闪存转换层仿真测试系统及方法 | |
WO2015074526A1 (en) | Method and apparatus for injecting java by tecode into target process | |
CN105074652B (zh) | 用于向打印机远程提供应用功能的方法和计算机系统 | |
WO2019179068A1 (zh) | 风险检测方法、装置、移动终端和存储介质 | |
KR20140073258A (ko) | 어플리케이션 정보 제공 방법 및 휴대 단말 | |
WO2021244459A1 (zh) | 一种输入方法及电子设备 | |
JP2006048645A (ja) | ドキュメントにコンテキスト情報を埋め込むための方法およびシステム | |
CN114443051A (zh) | 应用程序编译和运行方法及装置、存储介质 | |
KR102616793B1 (ko) | 전자 장치 및 전자 장치의 화면 제공 방법 | |
CN111104180A (zh) | 应用程序优化方法、装置、存储介质及电子设备 | |
US10599444B2 (en) | Extensible input stack for processing input device data | |
CN109145598B (zh) | 脚本文件的病毒检测方法、装置、终端及存储介质 | |
CN111444117B (zh) | 存储空间碎片化实现方法、装置、存储介质及电子设备 | |
CN112131000B (zh) | 一种插件应用程序的内存释放方法及装置 | |
CN116610354A (zh) | 参数校验方法、装置、计算机设备及存储介质 | |
CN112988304B (zh) | 一种操作方式的记录方法、装置、电子设备和存储介质 | |
WO2022227997A1 (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 |