一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

内存释放方法及相关设备与流程

2022-07-10 10:17:29 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种内存释放方法及相关设备。


背景技术:

2.垃圾回收(garbage collection,gc)机制是一种自动的内存管理机制。在虚拟机上运行的编程语言中,当计算机内存中的对象在应用程序中不再被使用时,根据垃圾回收机制会把这个对象占用的内存区块释放出来,让其他的应用程序或对象使用。垃圾回收机制最早起源于lisp语言,目前大多数的高级语言都支持垃圾回收机制,比如java、.net、go等。
3.目前有很多垃圾回收方法,然而,现有的垃圾回收方法可能存在内存释放时间过长并且内存释放失败的问题。


技术实现要素:

4.本技术实施例公开了一种内存释放方法及相关设备,能够加快内存释放并保证内存释放顺利进行。
5.本技术第一方面公开了一种内存释放方法,应用于电子设备,所述电子设备包括应用程序、虚拟机,所述应用程序运行在所述虚拟机中,所述虚拟机创建有垃圾回收线程、内存释放触发器和内存释放线程,所述电子设备还包括空闲内存列表和预释放内存列表,所述空闲内存列表记录所述电子设备的空闲内存,所述方法包括:若所述应用程序为低负载状态,所述内存释放触发器向所述垃圾回收线程发送内存释放触发信号;所述垃圾回收线程获取多个时间点所述电子设备的堆内存使用量;接收到所述内存释放触发信号后,所述垃圾回收线程根据所述堆内存使用量确定实际抽取内存大小;所述垃圾回收线程根据所述实际抽取内存大小,将所述空闲内存列表中的空闲内存抽取到所述预释放内存列表;所述内存释放线程将所述预释放内存列表中的内存释放给所述电子设备的操作系统。
6.本技术无需等待特定阶段(例如full gc)进行内存释放,可以在任意的垃圾回收模式下进行内存释放,加快了内存释放。并且,本技术避免了频繁释放内存导致应用程序暂停,也避免了不合适时机释放内存导致额外的时间开销。
7.此外,本技术将空闲内存从空闲内存列表抽取到预释放内存列表,通过内存释放线程将预释放内存列表里的空闲内存释放给操作系统,整个过程与用户线程和垃圾回收线程完全解耦,不会造成用户线程或垃圾回收线程因等待空闲内存释放给操作系统而停滞。
8.在一些可选的实施方式中,所述虚拟机还创建有采样线程,所述应用程序为低负载状态包括:所述电子设备的负载统计值和垃圾回收次数统计值都小于或等于预设阈值;其中,所述负载统计值是所述内存释放触发器对所述电子设备多个时间点的负载数据进行统计得到的,所述负载数据是所述采样线程采集得到的;所述垃圾回收次数统计值是所述内存释放触发器对所述电子设备的垃圾回收次数进行统计得到的,所述垃圾回收次数是所述垃圾回收线程依据预设时间间隔采集得到的。
9.根据负载统计值和垃圾回收次数统计值可以更加准确地确定应用程序的低负载状态,从而实现更加高效的内存释放。
10.在一些可选的实施方式中,所述负载数据包括操作系统的cpu负载数据和进程的cpu负载数据。
11.在一些可选的实施方式中,当下式中x的值为false时,所述应用程序为低负载状态:x=((o》t)||(p》t)||(g》(60/i));其中,x为应用程序的负载状态的逻辑值;o为所述操作系统的cpu负载统计值;p为所述进程的cpu负载统计值;t为cpu负载阈值;g为所述垃圾回收次数统计值;i为所述内存释放触发器的周期。
12.在一些可选的实施方式中,所述对所述电子设备多个时间点的负载数据进行统计包括:计算所述负载数据的加权平均值,将所述负载数据的加权平均值作为所述负载统计值。
13.在一些可选的实施方式中,所述对所述垃圾回收次数进行统计包括:计算所述垃圾回收次数的加权平均值,将所述垃圾回收次数的加权平均值作为所述垃圾回收次数统计值。
14.在一些可选的实施方式中,所述垃圾回收线程根据所述堆内存使用量确定实际抽取内存大小包括:所述垃圾回收线程根据所述堆内存使用量进行预测,得到堆内存使用量预测值;所述垃圾回收线程根据所述堆内存使用量预测值计算可抽取内存大小;所述垃圾回收线程根据所述可抽取内存大小确定所述实际抽取内存大小。
15.通过对堆内存使用量进行预测,可以使释放的内存能够满足应用程序的需要,又不会造成内存空间浪费。
16.在一些可选的实施方式中,所述根据所述堆内存使用量进行预测包括:计算所述堆内存使用量的加权平均值,将所述堆内存使用量的加权平均值作为所述堆内存使用量预测值。
17.在一些可选的实施方式中,所述可抽取内存大小根据下式计算:y=max((u-max(c,k)),0);其中,y为所述可抽取内存大小;u为所述应用程序占用的内存大小;c为所述堆内存使用量预测值;k为所述虚拟机启动时设定的初始化内存大小;max()表示计算最大值。
18.在一些可选的实施方式中,所述垃圾回收线程根据所述堆内存使用量预测值计算可抽取内存大小之前,所述方法还包括:所述垃圾回收线程判断所述预释放内存列表是否为空;若预释放内存列表为空,所述垃圾回收线程判断所述电子设备的堆内存大小是否大于所述堆内存使用量预测值;若所述堆内存大小大于所述堆内存使用量预测值,所述垃圾回收线程根据所述堆内存使用量预测值计算所述可抽取内存大小。
19.通过判断预释放内存列表是否为空,可以避免因抽取动作比释放动作快的情况下,预释放内存列表里积累大量处于中间状态的内存空间。中间状态的内存空间就是操作系统不能让其他进程复用,虚拟机也不能再使用的内存空间。
20.在一些可选的实施方式中,所述根据所述可抽取内存大小确定所述实际抽取内存大小包括:根据下式计算所述实际抽取内存大小:z=y*r;其中,z为所述实际抽取内存大小;y为所述可抽取内存大小;r为抽取比例。
21.在一些可选的实施方式中,所述应用程序为java应用程序,所述虚拟机为java虚
拟机。
22.在一些可选的实施方式中,在所述java虚拟机的混合垃圾回收的最终标记阶段,执行所述垃圾回收线程获取多个时间点所述电子设备的堆内存使用量、所述垃圾回收线程根据所述堆内存使用量确定实际抽取内存大小、以及所述垃圾回收线程根据所述实际抽取内存大小,将所述空闲内存列表中的空闲内存抽取到所述预释放内存列表。
23.在java虚拟机中,g1会经常触发年轻代垃圾回收,将内存释放安排在年轻代垃圾回收阶段会导致频繁地进行内存释放。将内存释放安排在在混合垃圾回收的最终标记阶段,可以避免频繁地进行内存释放并且保证内存释放的顺利进行。
24.本技术第二方面公开了一种计算机可读存储介质,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如第一方面所述的内存释放方法。
25.本技术第三方面公开了一种电子设备,所述电子设备包括处理器和存储器,所述存储器,用于存储指令,所述处理器用于调用所述存储器中的指令,使得所述电子设备执行如第一方面所述的内存释放方法。
26.本技术第四方面公开了一种芯片系统,该芯片系统应用于电子设备;芯片系统包括接口电路和处理器;接口电路和处理器通过线路互联;接口电路用于从电子设备的存储器接收信号,并向处理器发送信号,信号包括存储器中存储的计算机指令;当处理器执行该计算机指令时,芯片系统执行如第一方面所述的内存释放方法。
27.应当理解地,上述提供的第二方面的计算机可读存储介质,第三方面的电子设备,第四方面的芯片系统均与上述第一方面的方法对应,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
附图说明
28.图1是本技术实施例公开的内存释放方法的应用环境示意图。
29.图2是根据现有的内存释放方法,内存生命周期的示意图。
30.图3是实现本技术内存释放方法的电子设备的主要逻辑单元示意图。
31.图4是本技术实施例公开的内存释放方法的流程图。
32.图5是采集负载数据和垃圾回收次数的示意图。
33.图6是混合垃圾回收的示意图。
34.图7是本技术实施例公开的一种电子设备的结构示意图。
具体实施方式
35.为了便于理解,示例性的给出了部分与本技术实施例相关概念的说明以供参考。
36.需要说明的是,本技术中“至少一个”是指一个或者多个,“多个”是指两个或多于两个。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b可以表示:单独存在a,同时存在a和b,单独存在b的情况,其中a,b可以是单数或者复数。本技术的说明书和权利要求书及附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不是用于描述特定的顺序或先后次序。
37.操作系统(operating system):操作系统是管理计算机硬件与软件资源的计算机程序。操作系统需要处理计算机内的基本事务,例如管理与配置内存、决定系统资源供需的
优先次序、控制输入设备与输出设备、操作网络与管理文件系统等。操作系统也会提供一个让用户与系统交互的操作界面。
38.垃圾回收(garbage collection,gc):是一种自动的内存管理机制。在面向对象设计语言中,当计算机内存中的对象在应用程序中不再被使用时,垃圾回收机制会把这个对象占用的内存区块释放出来,让其他的应用程序或对象复用。
39.java:java是一门面向对象的编程语言。java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。java可以编写桌面应用程序、web应用程序、分布式系统和嵌入式系统应用程序等。
40.java虚拟机(java virtual machine,jvm):java虚拟机是java语言二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。
41.g1(garbage first):g1是面向服务端的jvm的垃圾回收器(也叫垃圾收集器),适用于多核处理器、大内存容量的服务端系统。g1关注最小延时的垃圾回收目标,同时实现高吞吐量。
42.应用程序挂起(stop the world,stw):stw机制是在进行垃圾回收时,除了垃圾回收(gc)线程,应用程序的其他线程都被挂起。此时,jvm只允许gc线程运行,其他线程则会全部暂停,等待gc线程执行完毕后才能再次运行。
43.完整垃圾回收(full garbage collection,full gc):通常指的是一次完整的垃圾回收,会对整个堆内存(包括老年代、年轻代、元空间(metaspace)等)进行回收。
44.年轻代垃圾回收(young/minor garbage collection,young gc,也叫新生代垃圾回收):对年轻代/新生代的堆内存进行垃圾回收。内存分成年轻代和老年代,年轻代存放刚创建的和存活时间比较短的对象,老年代存放存活时间比较长的对象。
45.混合垃圾回收(mixed garbage collection,mixed gc):mixed gc不仅进行新生代垃圾回收,同时也回收部分后台扫描线程标记的老年代分区。
46.内存区块(region):在垃圾回收机制中,对应用程序占用的堆内存划分成一个个区块进行管理。
47.full gc、young gc和mixed gc是g1的三种垃圾回收模式。一次性释放大量内存(即批量释放内存)给操作系统通常比较耗时,为了降低批量释放内存给操作系统造成的影响,g1将批量内存释放操作放在了full gc阶段(young gc和mixed gc只将空闲内存记录到空闲内存列表而不进行释放)。一方面,在full gc阶段批量释放内存仍然会耗费较长时间。另一方面,g1在full gc的时候会将应用程序挂起(stop the world,stw),为了避免应用程序卡顿,g1会尽可能地避免触发full gc。当jvm的应用程序负载下降或不活跃时,g1尽可能避免触发full gc的策略会导致jvm垃圾回收机制处于相对静止状态,不会再触发full gc(即内存释放给操作系统失败)。此时,除非强制从外部执行full gc,否则g1会一直保留和占用所有堆内存,不会将空闲的堆内存释放给操作系统,从而造成内存资源的浪费。例如,在按资源使用量付费的场景中,g1不将空闲的堆内存释放给操作系统会造成用户多支付不必要的费用,也会导致云提供商无法充分利用其硬件资源。
48.为了更好地理解本技术实施例公开的内存释放方法及相关设备,下面首先对本技术内存释放方法的应用环境进行描述。
49.图1是本技术实施例公开的内存释放方法的应用环境示意图。如图1所示,所述内
存释放方法应用于电子设备10。电子设备10包括至少一个应用程序100(图中示出了一个),例如视频播放器、游戏、社交应用程序等。电子设备10还包括虚拟机101,应用程序100运行在虚拟机101中。本技术实施例提供的内存释放方法在虚拟机101中运行的应用程序100为低负载状态时,计算实际抽取内存大小,根据实际抽取内存大小将空闲内存从空闲内存列表抽取到预释放空闲内存列表,将预释放空闲内存列表中的空闲内存释放给电子设备10的操作系统。本技术能够快速地进行内存释放,保证内存释放顺利进行。
50.其中,电子设备10可以包括智能手机、平板电脑、台式计算机、膝上型便携计算机、车载电脑等。
51.在本技术的一个实施例中,应用程序100可以是java应用程序,虚拟机101可以是java虚拟机。
52.在本技术的其他实施例中,应用程序100和虚拟机101可以是其他编程语言对应的应用程序和虚拟机。例如,应用程序100可以是go语言应用程序,虚拟机101可以是lvm虚拟机。
53.图2是根据现有的内存释放方法,内存生命周期的示意图。图中以jvm为例进行说明。
54.参见图2所示,根据现有的内存释放方法,内存生命周期包括如下阶段:
55.201,jvm申请保留内存。
56.在jvm启动期间或内存扩展期间,jvm会向操作系统申请保留一部分内存。在这个阶段,操作系统并不会真正给jvm分配内存区域和独占指定大小的内存区域。
57.202,jvm占用申请到的内存。
58.jvm触发调用操作系统的mmap方法。在这个阶段,操作系统会分配指定大小的内存区域给jvm独占,运行在操作系统上的其他进程不能再复用这块内存区域。
59.203,jvm把申请到的内存分割成一个个小的内存区块(region),将这些内存区块记录到空闲内存列表。
60.204,应用程序创建对象。
61.205,jvm上的用户线程(即应用程序线程)申请内存区块。
62.jvm上的用户线程会从空闲内存列表中申请一个或多个可用的内存区块。
63.206,jvm上的用户线程在申请到的内存区块中为对象分配内存区块,并把对象数据存入内存区块。
64.207,应用程序释放对象。
65.应用程序释放之前创建的不再使用的对象。
66.208,jvm的g1触发垃圾回收并且暂停应用程序。
67.触发的垃圾回收可以是young gc、mixed gc或者full gc。暂定应用程序也就是应用程序挂起。
68.209,jvm的g1把对象占用的内存区块记录到空闲内存列表。
69.如果不存在还在使用的对象数据,g1把对象占用的内存区块记录到空闲内存列表。
70.如果存在还在使用的对象数据,g1从空闲内存列表中申请新的内存区块,把还在使用的对象数据复制到新的内存区块,把对象原先占用的内存区块记录到空闲内存列表。
71.210,如果触发的垃圾回收是full gc,g1继续暂停应用程序。
72.211,g1在继续暂停应用程序的期间,根据空闲内存列表把空闲内存释放给操作系统。
73.g1在full gc阶段把空闲内存从空闲内存列表里释放给操作系统,在操作系统上的其他进程可以复用释放给操作系统的内存。
74.根据现有的内存释放方法,g1在full gc阶段把空闲内存从空闲内存列表里释放给操作系统,这种内存释放方法比较耗费时间,会造成应用程序卡顿。
75.本技术对内存释放过程进行改进,以加快内存释放并保证内存释放顺利进行。
76.图3是实现本技术内存释放方法的电子设备的主要逻辑单元示意图。
77.电子设备30包括采样线程300、垃圾回收(gc)线程301、内存释放触发器302、内存释放线程303、操作系统304。虚拟机(图上未示出)可以在启动时创建采样线程300、垃圾回收(gc)线程301、内存释放触发器302、内存释放线程303。
78.电子设备还包括策略类305和内存管理器306。
79.策略类305用于存储本技术内存释放方法中获取的各种数据,例如操作系统的cpu负载数据、java进程的cpu负载数据、gc次数、堆内存使用量。
80.内存管理器306存储应用程序的空闲内存列表、预释放内存列表和堆内存信息。堆内存信息包括堆内存使用量、堆内存大小。
81.需要说明的是,内存管理器306中存储的堆内存使用量是电子设备30实时的堆内存使用量,即实时数据。策略类305中存储的堆内存使用量是多个时间点的堆内存使用量,即时间序列数据。
82.采样线程300用于采集负载数据,图中的负载数据包括操作系统的cpu负载数据和java进程的cpu负载数据。采样线程300将采集的负载数据写入策略类305。
83.垃圾回收线程(即gc线程)301用于采集垃圾回收次数(即gc次数),将垃圾回收次数写入策略类305。
84.内存释放触发器302用于对负载数据进行统计,得到负载统计值,对垃圾回收次数进行统计,得到垃圾回收次数统计值。内存释放触发器302还用于根据负载统计值和垃圾回收次数统计值判断应用程序是否为低负载状态,若应用程序为低负载状态,向垃圾回收线程发送内存释放触发信号。
85.垃圾回收线程301还用于从内存管理器中获取多个时间点的堆内存使用量,将堆内存使用量写入策略类305,根据堆内存使用量进行预测,得到堆内存使用量预测值。
86.垃圾回收线程301还用于根据堆内存使用量预测值计算可抽取内存大小,根据可抽取内存大小确定实际抽取内存大小,根据实际抽取内存大小将空闲内存从空闲内存列表抽取到预释放内存列表。
87.内存释放线程303用于将预释放内存列表中的内存释放给操作系统304。
88.图4是本技术实施例公开的内存释放方法的流程图。所述内存释放方法应用于电子设备,电子设备包括应用程序和虚拟机,应用程序运行与虚拟机中,虚拟机包括采样线程、垃圾回收线程、内存释放触发器和内存释放线程。以下以应用程序为java应用程序,虚拟机为jvm为例进行说明。
89.401,采样线程采集电子设备多个时间点的负载数据。
90.例如,采样线程每300毫秒一次采集电子设备的负载数据。
91.在本技术的一个实施例中,负载数据包括操作系统的cpu负载数据和java进程的cpu负载数据。采样线程从操作系统获取操作系统的cpu负载数据,从java进程获取java进程的cpu负载数据。
92.在本技术的一个实施例中,采样线程可以将负载数据写入g1的策略类中。
93.402,内存释放触发器对负载数据进行统计,得到负载统计值。
94.在本技术的一个实施例中,内存释放触发器可以从g1的策略类中读取负载数据(即负载数据的时间序列数据)。
95.在本技术的一个实施例中,内存释放触发器对操作系统的cpu负载数据进行统计,得到操作系统的cpu负载统计值,对java进程的cpu负载数据进行统计,得到java进程的cpu负载统计值。
96.内存释放触发器可以对预设时间点之前预设数量(例如十个)的负载数据进行统计,得到负载统计值。
97.在本技术的一个实施例中,内存释放触发器可以通过加权平均的方法(即计算负载数据的加权平均值)计算负载统计值。
98.403,垃圾回收线程依据预设时间间隔(例如每分钟)采集电子设备的垃圾回收次数。
99.在本技术的一个实施例中,垃圾回收线程可以将依据预设时间间隔采集的垃圾回收次数(即垃圾回收次数的时间序列数据)写入g1的策略类中。
100.在本技术的一个实施例中,垃圾回收线程在每次触发垃圾回收时,判断垃圾回收次数统计时长是否超过预设时间间隔,如果没有超过预设时间间隔,则把垃圾回收次数加1。如果超过预设时间间隔,则把当前的垃圾回收次数写入g1的策略类中,再把垃圾回收次数重置为1并对垃圾回收次数统计时长重新计时。
101.404,内存释放触发器对垃圾回收次数进行统计,得到垃圾回收次数统计值。
102.在本技术的一个实施例中,内存释放触发器可以从g1的策略类中读取垃圾回收次数(即垃圾回收次数的时间序列数据)。
103.内存释放触发器可以对预设时间点之前预设数量(例如十个)的垃圾回收次数进行统计,得到垃圾回收次数统计值。
104.在本技术的一个实施例中,内存释放触发器可以通过加权平均的方法(即计算垃圾回收次数的加权平均值)计算垃圾回收次数统计值。
105.405,内存释放触发器根据负载统计值和垃圾回收次数统计值判断应用程序是否为低负载状态。
106.内存释放触发器可以周期性地(例如15秒一次)根据负载统计值和垃圾回收次数统计值判断应用程序是否为低负载状态。
107.在本技术的一个实施例中,当负载统计值和垃圾回收次数统计值中的任意一个都小于或等于预设阈值时,判断应用程序为低负载状态。若负载统计值和垃圾回收次数统计值中的任意一个大于预设阈值,判断应用程序为高负载状态。例如,负载统计值包括操作系统的cpu负载统计值、java进程的cpu负载统计值,若操作系统的cpu负载统计值、java进程的cpu负载统计值和垃圾回收次数统计值中的任意一个都小于或等于预设阈值,则判断应
用程序为低负载状态。
108.在本技术的一个实施例中,可以根据下式判断应用程序是否为低负载状态:
109.x=((o》t)||(p》t)||(g》(60/i));
110.其中:
111.x:应用程序的负载状态的逻辑值,true(即(o》t)、(p》t)、(g》(60/i)中的任意一个成立)表示应用程序是高负载状态,false(即(o》t)、(p》t)、(g》(60/i)中的任意一个都不成立)表示应用程序是低负载状态;
112.o:操作系统的cpu负载统计值;
113.p:java进程的cpu负载统计值;
114.t:cpu负载阈值,根据实际需要设置,例如设置为cpu满载的10%;
115.g:gc次数统计值;
116.i:内存释放触发器的周期,根据实际需要设置,例如设置为15秒。
117.应当理解,操作系统的cpu负载统计值和java进程的cpu负载统计值可以对应相同的预设阈值,也可以对应不同的预设阈值。例如,操作系统的cpu负载统计值的预设阈值可以是cpu满载的10%,java进程的cpu负载统计值的预设阈值可以是cpu满载的15%。
118.本实施例中,获取负载数据和垃圾回收次数,对负载数据进行统计得到负载统计值,对垃圾回收次数进行统计得到垃圾回收次数统计值,根据负载统计值和垃圾回收次数统计值判断应用程序是否为低负载状态,可以更加准确地确定应用程序的低负载状态,从而实现更加高效的内存释放。
119.应当理解,在其他的实施例中,可以获取负载数据或垃圾回收次数,对负载数据进行统计得到负载统计值,或者对垃圾回收次数进行统计得到垃圾回收次数统计值,根据负载统计值或垃圾回收次数统计值判断应用程序是否为低负载状态。
120.406,若应用程序为低负载状态,内存释放触发器向垃圾回收线程发送内存释放触发信号。
121.例如,操作系统的cpu负载统计值、java进程的cpu负载统计值和垃圾回收次数统计值中的任意一个都小于或等于预设阈值,此时判断应用程序为低负载状态,内存释放触发器向垃圾回收线程发送内存释放触发信号。
122.407,垃圾回收线程从内存管理器获取多个时间点电子设备的堆内存使用量。
123.内存管理器存储有电子设备实时的堆内存使用量,垃圾回收线程可以周期性地从内存管理器获取堆内存使用量,得到多个时间点的堆内存使用量。
124.在本技术的一个实施例中,垃圾回收线程可以将获取的堆内存使用量写入g1的策略类中。
125.408,接收到内存释放触发信号后,垃圾回收线程根据堆内存使用量进行预测,得到堆内存使用量预测值。
126.在本技术的一个实施例中,垃圾回收线程可以从g1的策略类中读取堆内存使用量(即堆内存使用量的时间序列数据)。
127.垃圾回收线程可以根据预设时间点之前预设数量(例如十个)的堆内存使用量进行预测,得到堆内存使用量预测值。
128.在本技术的一个实施例中,垃圾回收线程可以通过加权平均的方法(即计算堆内
存使用量的加权平均值)计算堆内存使用量预测值。
129.应用程序可释放的内存区块会加入空闲内存列表,如果每次从空闲内存列表抽取到预释放内存列表的内存(即内存区块)过多,当应用程序波动负载变高而空闲列表内存中的内存区块不够时,g1首先会触发gc,触发gc会附带着应用程序挂起,如gc完之后空闲列表里的内存还不够,就会向操作系统申请保留内存,并提交和占用内存,在这个阶段也会一直持续应用程序挂起。如果抽取太少,又会造成应用程序占用持有的可释放空闲内存太多,其他进程不能复用这部分内存。为了使抽取后剩余的空闲内存即能满足应用程序的需要,又不会造成太多内存空间浪费,本技术的实施例中,在每次gc开始时进行预测,确定应用程序在预设时间点将会需要多少内存。
130.409,垃圾回收线程根据堆内存使用量预测值计算可抽取内存大小。
131.在本技术的一个实施例中,可以根据下式计算可抽取内存大小:
132.y=max((u-max(c,k)),0);
133.其中:
134.y:可抽取内存大小;
135.u:应用程序占用的内存大小;
136.c:堆内存使用量预测值;
137.k:jvm启动时设定的初始化内存大小;
138.max()表示计算最大值。
139.在本技术的一个实施例中,预释放内存列表为链表结构。
140.在本技术的一个实施例中,垃圾回收线程根据预设时间点的堆内存使用量预测值计算可抽取内存大小之前,还判断预释放内存列表是否为空。若预释放内存列表为空,垃圾回收线程判断电子设备的堆内存大小是否大于堆内存使用量预测值。若堆内存大小大于堆内存使用量预测值,垃圾回收线程根据预设时间点的堆内存使用量预测值计算可抽取内存大小。若预释放内存列表不为空,或者堆内存大小小于或等于堆内存使用量预测值,则流程结束。
141.堆内存在虚拟机启动的时候就被创建,用于存储应用程序的各种对象。
142.通过判断预释放内存列表是否为空,在判断预释放内存列表为空再进行空闲内存抽取,可以避免因抽取动作比释放动作快的情况下,预释放内存列表里积累大量处于中间状态的内存空间。中间状态的内存空间就是操作系统不能让其他进程复用,虚拟机也不能再使用的内存空间。
143.410,垃圾回收线程根据可抽取内存大小确定实际抽取内存大小。
144.根据可抽取内存大小确定实际抽取内存大小是为了更合理地释放空闲内存,使预设时间点的内存占用量与应用程序的实际内存使用量拟合贴近。
145.在本技术的一个实施例中,可以根据下式计算实际抽取内存大小:z=y*r,其中:
146.z:实际抽取内存大小;
147.y:可抽取内存大小;
148.r:抽取比例。
149.抽取比例可以根据实际需要设置,例如设置为10%。可以在jvm启动时通过指定参数对抽取比例进行设置。
150.411,垃圾回收线程根据实际抽取内存大小将空闲内存列表中的空闲内存抽取到预释放内存列表。
151.gc线程和用户线程只能操作空闲内存列表里的内存区块,预释放内存列表内的内存区块不能被用户线程和gc线程操作。将空闲内存列表中的空闲内存抽取到预释放内存列表,可以实现内存释放线程释放空闲内存时不影响gc线程和用户线程的执行。
152.412,内存释放线程将预释放内存列表中的内存释放给操作系统。
153.现有的内存释放方法可能存在垃圾回收时间较长、某些时候垃圾回收失效的问题。例如,g1在full gc阶段一次性释放大量内存会耗费较长时间,当jvm的应用程序负载下降或不活跃时,g1尽可能避免触发full gc的策略会导致jvm垃圾回收机制处于相对静止状态,不会再触发full gc,从而造成内存资源的浪费。
154.相比较,本技术采集负载数据(例如操作系统的cpu负载数据、java进程的cpu负载数据)和gc次数,根据负载数据和gc次数确定应用程序是否为低负载状态,在应用程序为低负载状态时把空闲内存抽取到预释放内存列表进行释放。本技术无需等待特定阶段(例如full gc)进行内存释放,可以在任意的垃圾回收模式下进行内存释放,加快了内存释放。本技术避免了频繁(抽取动作依赖gc逻辑,g1各种类型的gc频率会很高)释放内存导致应用程序暂停,也避免了不合适时机(即应用程序为高负载状态)释放内存导致额外的时间开销。如果在应用程序为高负载状态时释放内存,应用程序会重新向os申请内存,会产生一定的时间开销。
155.本技术将空闲内存从空闲内存列表抽取到预释放内存列表,通过内存释放线程将预释放内存列表里的空闲内存释放给os,整个过程与用户线程和gc线程完全解耦,不会造成用户线程或gc线程因等待空闲内存释放给os而停滞。
156.本技术根据堆内存使用量进行预测,根据堆内存使用量预测值计算可抽取内存大小,根据可抽取内存大小确定实际抽取内存大小,从而让释放后的内存占用量拟合贴近应用程序的实际内存使用量,实现平滑释放空闲内存给os,避免在应用程序的负载波动时释放内存带来的负面影响。
157.经过实验可知,在应用程序的负载降低后,进程(例如java进程)占用内存量和进程实际使用内存量逐步趋于拟合。
158.参阅图5所示,是采集负载数据和垃圾回收次数的示意图。
159.501,jvm在启动时初始化和启动采样线程。
160.502,采样线程从操作系统采集操作系统的cpu负载数据。
161.503,采样线程将操作系统的cpu负载数据写入g1的策略类。
162.504,采样线程从操作系统采集java进程的cpu负载数据。
163.505,采样线程将java进程的cpu负载数据写入g1的策略类。
164.506,垃圾回收线程统计每个时间间隔的垃圾回收次数。
165.507,垃圾回收线程将垃圾回收次数写入g1的策略类。
166.在本技术的一个实施例中,可以在mixed gc的最终标记(remark)阶段把可释放空闲内存抽取到预释放列表,以进一步减少应用程序挂起时间。具体地,408中,在mixed gc的remark阶段,垃圾回收线程根据堆内存使用量对预设时间点进行预测,得到堆内存使用量预测值。409中,在mixed gc的remark阶段,垃圾回收线程根据预设时间点的堆内存使用量
预测值计算可抽取内存大小。410中,在mixed gc的remark阶段,垃圾回收线程根据可抽取内存大小确定实际抽取内存大小,根据实际抽取内存大小将空闲内存列表中的空闲内存抽取到预释放内存列表。mixed gc的remark阶段应用程序挂起时间较短,从而能够避免由于内存释放造成应用程序长时间挂起。
167.为了便于理解最终标记阶段,图6给出了mixed gc的示意图。mixed gc包括初始标记、并发标记、最终标记、筛选回收四个阶段。
168.初始标记(initial mark)阶段用于标记gc root能直接关联的对象(短暂stw)。
169.并发标记(concurrent mark)阶段用于从并发标记中的root遍历,对不可达的对象进行标记,耗时长但可并发。
170.最终标记(remark)阶段用于收集并发标记期间产生的新垃圾(短暂stw)。
171.筛选回收(live data counting and evacuation)阶段用于对各个region的回收性价比排序,在保证时间可控的情况下清除失活对象。
172.mixed gc的更多内容可以参考相关技术,此处不再赘述。
173.请参见图7,图7是本技术实施例公开的一种电子设备的结构示意图。如图4所示,电子设备40可以包括:射频(radio frequency,rf)电路701、存储器702、输入单元703、显示单元704、传感器705、音频电路706、无线保真(wireless fidelity,wi-fi)模块707、处理器708以及电源709等部件。本领域技术人员可以理解,图4中示出的电子设备的结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
174.rf电路701可用于收发信息或在通话过程中,对信号进行接收和发送,特别地,接收基站的下行信息后,转给处理器708进行处理;另外,将涉及上行的数据发送给基站。通常,rf电路701包括,但不限于:天线、至少一个放大器、收发信机、耦合器、低噪声放大器(low noise amplifier,lna)、双工器等。
175.存储器702可用于存储软件程序以及模块,处理器708通过运行存储在存储器702中的软件程序以及模块,从而执行电子设备的各种功能应用以及数据处理。存储器702可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据电子设备的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器702可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
176.输入单元703可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。具体地,输入单元703可包括触控面板7031以及其他输入设备7032。触控面板7031,也称为触摸屏,可收集用户在其上或附近的触摸操作(比如用户使用手指、触控笔等任何适合的物体或附件在触控面板7031上或在触控面板7031附近的操作),并根据预先设定的程序驱动相应的连接装置。可选地,触控面板7031可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器708,并接收处理器708发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板7031。除了触控面板
7031,输入单元703还可以包括其他输入设备7032。具体地,其他输入设备7032可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
177.显示单元704可用于显示由用户输入的信息或提供给用户的信息以及电子设备的各种菜单。显示单元704可包括显示面板7041,可选地,可以采用液晶显示器(liquid crystal display,lcd)、有机发光二极管(organic light-emitting diode,oled)等形式来配置显示面板7041。进一步地,触控面板7031可覆盖显示面板7041,当触控面板7031检测到在其上或附近的触摸操作后,传送给处理器708以确定触摸事件的类型,随后处理器708根据触摸事件的类型在显示面板7041上提供相应的视觉输出。虽然在图4中,触控面板7031与显示面板7041是作为两个独立的部件来实现电子设备的输入和输出功能,但是在某些实施例中,可以将触控面板7031与显示面板7041集成而实现电子设备的输入和输出功能。
178.电子设备还可包括至少一种传感器705,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板7041的亮度,接近传感器可在电子设备移动到耳边时,关闭显示面板7041和/或背光。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别电子设备姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;此外,电子设备还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
179.音频电路706、扬声器7061,传声器7062可提供用户与电子设备之间的音频接口。音频电路706可将接收到的音频数据转换后的电信号,传输到扬声器7061,由扬声器7061转换为声音信号输出;另一方面,传声器7062将收集的声音信号转换为电信号,由音频电路706接收后转换为音频数据,再将音频数据输出处理器708处理后,经rf电路701发送给另一电子设备,或者将音频数据输出至存储器702以便进一步处理。
180.wi-fi属于短距离无线传输技术,电子设备通过wifi模块707可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图4示出了wi-fi模块707,但是可以理解的是,其并不属于电子设备的必需构成,完全可以根据需要、在不改变发明本质的范围内进行省略。
181.处理器708是电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器702内的软件程序和/或模块,以及调用存储在存储器702内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。可选地,处理器708可包括一个或多个处理单元;优选的,处理器708可集成应用处理器和调制解调器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器708中。
182.电子设备还包括给各个部件供电的电源709(比如电池),可选地,电源可以通过电源管理系统与处理器708逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
183.尽管未示出,电子设备还可以包括摄像头、蓝牙模块等,在此不再赘述。
184.图4中描述的电子设备可以用于实施本技术图2介绍的方法实施例中的部分或全
部流程,可参见前述图2所述实施例中的相关阐述,这里不再赘述。
185.本实施例还提供一种计算机存储介质,该计算机存储介质中存储有计算机指令,当该计算机指令在电子设备上运行时,使得电子设备执行上述相关方法步骤实现上述实施例中的内存释放方法。
186.本实施例还提供了一种计算机程序产品,当该计算机程序产品在电子设备上运行时,使得电子设备执行上述相关步骤,以实现上述实施例中的内存释放方法。
187.另外,本技术的实施例还提供一种装置,这个装置具体可以是芯片,组件或模块,该装置可包括相连的处理器和存储器;其中,存储器用于存储计算机执行指令,当装置运行时,处理器可执行存储器存储的计算机执行指令,以使芯片执行上述各方法实施例中的内存释放方法。
188.其中,本实施例提供的电子设备、计算机存储介质、计算机程序产品或芯片均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
189.通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
190.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其他的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,该模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其他的形式。
191.该作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
192.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
193.该集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
194.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何在本技术揭露的技术范围内的变化或替换,都应涵盖在本技术的保护范围之内。因此,本申
请的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献