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

一种内存伸缩管理方法、装置、电子设备以及存储介质与流程

2021-11-18 01:23:00 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种内存伸缩管理方法、装置、电子设备以及存储介质。


背景技术:

2.java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级web应用开发和移动应用开发。java应用启动的时候,需要设置java虚拟机(java virtual machine,jvm)参数以保证程序可以按照规划的方向运行。
3.其中,jvm参数中的“ xmx”表示设置的java堆内存的最大值。如果“ xmx”一旦设置,那么在java应用启动后就不可修改,这时候想要修改该参数必须重启java应用。然而,线上服务处理请求的量并非是一成不变的,如只有在个别时间接收到的请求量多,而在大部分时间接收到的请求量都较低。这时候为了保证java应用的可用性,通常会将应用所需的资源设置成峰值流量的标准,但是在非峰值流量的时段并不需要这么多资源,从而容易造成大量资源的浪费。


技术实现要素:

4.本技术提供了一种内存伸缩管理方法、装置、电子设备以及存储介质,能够动态调整java堆内存规格,从而避免内存资源浪费。
5.本技术的技术方案是这样实现的:
6.第一方面,本技术实施例提供了一种内存伸缩管理方法,该方法包括:
7.监测当前应用的服务请求流量;
8.当所述服务请求流量小于预设流量下限值时,利用balloon缩小所述当前应用的java堆内存规格并进行内存释放;
9.当所述服务请求流量大于预设流量上限值时,移除所述balloon,恢复所述当前应用的java堆内存规格。
10.第二方面,本技术实施例提供了一种内存伸缩管理装置,应用于电子设备,该内存伸缩管理装置包括监测单元和内存管理单元,其中,
11.所述监测单元,配置为监测当前应用的服务请求流量;
12.所述内存管理单元,配置为当所述服务请求流量小于预设流量下限值时,利用balloon缩小所述当前应用的java堆内存规格并进行内存释放;以及当所述服务请求流量大于预设流量上限值时,移除所述balloon,恢复所述当前应用的java堆内存规格。
13.第三方面,本技术实施例提供了一种电子设备,该电子设备包括存储器和处理器,其中,
14.所述存储器,用于存储能够在所述处理器上运行的计算机程序;
15.所述处理器,用于在运行所述计算机程序时,执行如第一方面所述的内存伸缩管理方法。
16.第四方面,本技术实施例提供了一种计算机存储介质,该计算机存储介质存储有计算机程序,所述计算机程序被至少一个处理器执行时实现如第一方面所述的内存伸缩管理方法。
17.本技术实施例所提供的一种内存伸缩管理方法、装置、电子设备以及存储介质,通过监测当前应用的服务请求流量;当服务请求流量小于预设流量下限值时,利用balloon缩小当前应用的java堆内存规格并进行内存释放;当服务请求流量大于预设流量上限值时,移除balloon,恢复当前应用的java堆内存规格。这样,通过监测应用的服务请求流量,当监测到服务请求流量较小时,通过balloon缩小java堆内存规格并释放内存,释放出的内存可以提供给服务请求流量较大的其它应用;而当监测到服务请求流量较大时,还可以移除balloon以恢复java堆内存规格;从而通过动态调整java堆内存规格,可以实现多应用“错峰”共享内存,降低应用对物理内存的整体占用,进而提高了应用在电子设备上的部署密度,避免内存资源浪费。
附图说明
18.图1为本技术实施例提供的一种内存伸缩管理方法的流程示意图;
19.图2为本技术实施例提供的另一种内存伸缩管理方法的流程示意图;
20.图3为本技术实施例提供的一种容器系统的架构示意图;
21.图4为本技术实施例提供的一种balloon技术的工作原理示意图;
22.图5为本技术实施例提供的一种基于balloon技术的实现过程示意图;
23.图6为本技术实施例提供的又一种内存伸缩管理方法的流程示意图;
24.图7为本技术实施例提供的一种内存伸缩管理装置的组成结构示意图;
25.图8为本技术实施例提供的一种电子设备的组成结构示意图
26.图9为本技术实施例提供的一种电子设备的具体硬件结构示意图;。
具体实施方式
27.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述。可以理解的是,此处所描述的具体实施例仅用于解释相关申请,而非对该申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关申请相关的部分。
28.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
29.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
30.需要指出,本技术实施例所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
31.对本技术实施例进行进一步详细说明之前,对本技术实施例中涉及的名词和术语
进行说明,本技术实施例中涉及的名词和术语适用于如下的解释:
32.源自控制组群(control groups,cgroup):cgroup是linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对中央处理器(central processing unit,cpu),内存等资源实现精细化的控制,例如,轻量级容器docker就使用了cgroup提供的资源限制能力来完成cpu,内存等部分的资源控制。
33.内存溢出(out of memory,oom):指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存,此时,程序就无法再运行。
34.可以理解,java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级万维网(world wide web,简称web)应用开发和移动应用开发。java不同于一般的编译语言或解释型语言。它首先将源代码编译成字节码,再依赖各种不同平台上的虚拟机来解释执行字节码,从而具有“一次编写,到处运行”的跨平台特性。java语言由于它独特的魅力,一直是开发人员最喜欢的语言之一,甚至现在两大移动端操作系统之一的安卓系统(android)的大部分代码都是java编写的。
35.具体来说,java应用在启动的时候,需要设置java虚拟机(java virtual machine,jvm)参数以保证程序可以按照规划的方向运行。jvm参数中的“ xmx”表示设置的java堆内存的最大值,该参数一旦设置,在java应用启动后就不可以修改了,想要修改这个参数必须重启java应用。通常来说,线上服务处理请求的量并非是一成不变的,大多具有潮汐效应,即只有在个别时间接收到的请求量多,而在大部分时间接收到的请求量都较低。由于jvm参数的限制,为了在接收的请求量较多的情况下,尤其是在请求量达到峰值流量时,保证java应用的可用性,应用开发人员一般会把应用所需的资源设置成峰值流量的标准。由于应用处于峰值流量的时间相对于应用的服务时间是非常短暂的,应用在一般时间都是不需要这么多资源的,这样就造成了大量资源的浪费。另外,对于java应用冷启动时,没有热身的java应用在性能上不能达到最佳水平,如果此时直接面对峰值流量还会造成线上服务抖动。
36.基于此,本技术实施例提供了一种内存伸缩管理方法,该方法的基本思想是:监测当前应用的服务请求流量;当服务请求流量小于预设流量下限值时,利用balloon缩小当前应用的java堆内存规格并进行内存释放;当服务请求流量大于预设流量上限值时,移除balloon,恢复当前应用的java堆内存规格。这样,通过监测应用的服务请求流量,当监测到服务请求流量较小时,通过balloon缩小java堆内存规格并释放内存,释放出的内存可以提供给服务请求流量较大的其它应用;而当监测到服务请求流量较大时,还可以移除balloon以恢复java堆内存规格;从而通过动态调整java堆内存规格,可以实现多应用“错峰”共享内存,降低应用对物理内存的整体占用,进而提高了应用在电子设备上的部署密度,避免内存资源浪费。
37.下面将结合附图对本技术各实施例进行详细说明。
38.本技术的一实施例中,参见图1,其示出了本技术实施例提供的一种内存伸缩管理方法的流程示意图。如图1所示,该方法可以包括:
39.s101、监测当前应用的服务请求流量。
40.需要说明的是,本技术实施例提供的内存伸缩管理方法可以应用于内存伸缩管理
装置,或者集成有该装置的电子设备。这里,电子设备可以包括服务器、主机等。
41.还需要说明的是,在本技术实施例中,应用通常是指java应用。一方面,由于jvm参数中的“ xmx”一旦设置,在java应用在启动就不能再修改;另一方面,应用开发人员设置该参数时必须小于容器的cgroup限制,否则就会触发容器的oom,而导致应用被系统杀掉。如果应用开发人员为可能的流量洪峰提前设置很大的java堆内存,由于应用处于峰值流量的时间相对于应用的服务时间是非常短暂的,必然会造成大量的资源浪费。因此,如何在不重启java应用的前提下动态弹性伸缩java堆成为急需解决的问题,本技术实施例主要针对在现有技术中,java应用无法动态修改java堆大小而造成大量资源浪费的问题提出解决方案。
42.还需要说明的是,在本技术实施例中,应用的服务请求流量也称作应用流量,可以理解,当服务请求流量较大时,应用需要处理的服务请求会很多,这时候就需要java堆具有较大的内存;当服务请求流量较小或者无流量时,应用需要处理的服务请求也就较少,这时候较小的java堆内存就可以满足需求。
43.另外,本技术实施例在监测应用的服务请求流量时,可以通过在电子设备上部署代理模块的方式来实现。因此,在一些实施例中,电子设备中可以部署有代理(agent)模块;所述监测当前应用的服务请求流量,可以包括:通过agent模块监测当前应用的服务请求流量。
44.s102、当服务请求流量小于预设流量下限值时,利用balloon缩小当前应用的java堆内存规格并进行内存释放。
45.需要说明的是,当当前应用的服务请求流量小于预设流量下限值时,说明对于当前应用来说,仅需处理少量服务请求或者无需处理服务请求。这时候应用实际的工作内存,即应用使用的java堆内存,远小于预设的使应用足够应对流量峰值的java堆内存。例如:对于某一应用,在服务请求流量为流量峰值的情况下,需要设置java堆内存规格为8g来应对流量峰值,但是在服务请求流量未处于流量峰值期间时,例如在服务请求流量小于预设流量下限值的情况下,仅需1g的java堆内存就可以满足该应用的运行,其它7g内存并没有被该应用使用,此时就可以利用balloon将该应用的java堆内存规格缩小为1g,并将这多余的7g内存进行释放,释放的7g内存被归还给操作系统,可以供其它处于流量峰值的应用使用。
46.还需要说明的是,在本技术实施例中,在一个电子设备上可以部署多个容器,每个容器上可以运行至少一个应用。另外,容器可以包括运行应用的容器或者虚拟机,即容器和虚拟机均可以作为应用运行的环境,不会影响本技术实施例的实施和技术效果的实现。
47.本技术实施例中,以在一个容器上运行一个应用为例。应用的java堆就是指在其所运行的容器上,分配给该java应用的内存,因此,释放java堆的内存也就相当于释放容器的内存。
48.还需要说明的是,本技术实施例利用balloon技术实现java堆内存规格的改变,balloon意为气球,气球有体积但是没有质量,在本技术实施例中就是指虽然在jvm的java堆(heap)中占用了一块位置,但实际并不占用物理内存页,这部分内存可以被归还给操作系统方便别的应用使用。这样,就实现了多应用共享物理内存,从而能够在内存相同的条件下,通过本技术实施例提供的方法实现运行更多应用。
49.具体地,在一些实施例中,当服务请求流量小于预设流量下限值时,所述利用
balloon缩小当前应用中的java堆内存规格并进行内存释放,可以包括:
50.利用balloon在当前应用的java堆中进行位置占用,释放被balloon占用的空闲内存,并对当前应用的java堆内存规格进行第一调整;
51.其中,第一调整用于指示缩小当前应用的java堆内存规格。
52.需要说明的是,当监测到当前应用的服务请求流量小于预设流量下限值时,就在当前应用的java堆中放置balloon进行位置占用,被balloon占用的位置的空闲内存就被释放归还给操作系统,并通过第一调整将当前应用的java内存规格缩小。
53.s103、当服务请求流量大于预设流量上限值时,移除balloon,恢复当前应用的java堆内存规格。
54.需要说明的是,如果监测到当前应用的服务请求流量大于预设流量上限值,例如达到了流量峰值,仅能够满足一般情况下应用运行的java堆内存无法应对峰值流量,这时候就需要将java堆内存规格进行恢复,以保证足够的内存来处理大量的服务请求,此时将java堆中占位的balloon移除,并恢复java堆内存规格。在本技术实施例中,预设流量下限值可以小于或者等于预设流量上限值。
55.在一些实施例中,该方法还可以包括:通过agent模块预留guarantee内存;其中,guarantee内存用于确保电子设备在当前应用的java堆中移除balloon或者监测到full gc信号时不会出现内存溢出现象。
56.需要说明的是,通过balloon技术可以把java堆的空闲内存释放掉,但使用balloon技术(在本技术实施例中,也可以称作java ballon技术)弹性伸缩java堆内存有一个前提,需要保证balloon对象不可移动,balloon对象移动会导致通过balloon释放的物理内存页重新被加载回物理内存,如果此时物理内存不足,就会发生oom。为了避免这种情况,本技术实施例还可以通过agent模块在主机提前保留一部分物理内存(即guarantee内存),在可能出现oom的时刻使用guarantee内存。该guarantee内存可以为一组运行java应用的容器提供分时共享。从而保证了在当前应用的java堆中移除balloon或者监测到full gc信号时不会出现内存溢出现象而导致应用被系统杀掉。
57.进一步地,当使用guarantee内存恢复java堆内存规格时,在一些实施例中,当服务请求流量大于预设流量上限值时,所述移除balloon,恢复当前应用的java堆内存规格,可以包括:
58.在移除balloon后,将guarantee内存分配给当前应用的java堆,并对当前应用的java堆内存规格进行第二调整,以恢复所述当前应用的java堆内存规格;
59.其中,第二调整用于指示增大当前应用的java堆内存规格。
60.需要说明的是,当服务请求流量大于预设流量上限值时,在移除ballon后,可以将guarantee内存分配给当前应用的java堆,并对java堆内存规格进行第二调整增大java堆内存规格,以使得java堆内存规格恢复至足以应对流量峰值的大小。
61.可见,guarantee内存能够保证在balloon失效时,即当电子设备上有多个应用处于峰值流量时,电子设备的内存不足以支持恢复多个处于峰值流量状态的应用的java堆内存规格时,就可以通过guarantee内存将恢复java堆内存规格,避免由于内存不足导致发生oom。
62.进一步地,当使用guarantee内存保证应用在进行full gc时不会出现内存溢出现
象时,该方法还可以包括:
63.通过agent模块监测到full gc信号后,判断guarantee内存是否满足预设条件;
64.若guarantee内存满足预设条件,则利用guarantee内存恢复当前应用的java堆内存规格,并通知当前应用执行垃圾回收操作;
65.若guarantee内存不满足预设条件,则继续执行判断guarantee内存是否满足预设条件的步骤。
66.需要说明的是,在本技术实施例中,guarantee内存可以防止应用在进行垃圾回收(full garbage collection,full gc)的时候会发生内存溢出从而导致应用被操作系统杀掉。但是,如果在电子设备中为每一个应用都保留一块guarantee内存,那么电子设备的内存使用率并不会降低。因此,本技术实施例还可以通过多应用共享guarantee内存来避免应用发生内存溢出,还保证了电子设备的内存使用率。
67.具体来说,为了防止多个应用同时执行full gc而造成内存溢出,当应用将要进行full gc的时候,agent模块会先判断guarantee内存是否满足预设条件,在guarantee内存满足预设条件的情况下,利用guarantee内存恢复当前应用的java堆内存规格,并通知当前应用执行垃圾回收操作;如果guarantee内存不满足预设条件,就继续进行判断。
68.对于判断guarantee内存是否满足预设条件,在一些具体的实施例中,所述判断guarantee内存是否满足预设条件,可以包括:
69.若guarantee内存大于或等于恢复当前应用的java堆内存规格所需的内存,则确定guarantee内存满足预设条件;
70.若guarantee内存小于恢复当前应用的java堆内存规格所需的内存,则确定guarantee内存不满足预设条件。
71.需要说明的是,在判断guarantee内存是否满足预设条件时,可以是判断guarantee内存当前是否充足,即判断guarantee内存当前的剩余内存是否足够将恢复当前应用的java堆内存规格,如果guarantee内存足够,就恢复当前应用的java堆内存规格;如果guarantee内存不够,说明此时guarantee内存可能正在被其它应用使用,不足以恢复当前应用的java堆内存规格,需要继续进行判断,直至其它应用完成使用并释放guarantee内存,此时就可以利用guarantee内存恢复当前应用的java堆内存规格。另外,由于一个应用使用guarantee内存的时间通常在一毫秒之内,因此,使用guarantee内存并不会影响应用的正常运行。
72.在当前应用执行完垃圾回收之后,就不再需要较大的java堆内存,可以将内存进行释放。因此,在一些实施例中,该方法还可以包括:
73.在将恢复当前应用的java堆内存规格,当前应用成功执行垃圾回收操作后,通过agent模块执行刷新balloon的操作,缩小当前应用的java堆内存规格并进行内存释放,以恢复guarantee内存。
74.需要说明的是,在当前应用执行垃圾回收操作之后,就需要将内存归还给guarantee内存。具体地,可以通过agent模块执行刷新balloon的操作,再次使用balloon在java堆中进行位置占用,并缩小java堆内存规格,将从guarantee内存中分配给该java堆的内存返还给guarantee内存,即恢复guarantee内存。
75.在一些实施例中,电子设备中部署有若干个容器,每一容器上运行的应用数量为
至少一个;
76.相应地,当服务请求流量大于预设流量上限值时,所述移除balloon,恢复当前应用的java堆内存规格,可以包括:
77.获取若干个容器上运行的应用利用balloon释放的物理内存;
78.在移除balloon后,将物理内存分配给当前应用的java堆,并对当前应用的java堆内存规格进行第二调整,以恢复当前应用的java堆内存规格;
79.其中,第二调整用于指示增大当前应用的java堆内存规格。
80.需要说明的是,在本技术实施例中,电子设备上可以部署有若干个容器,而且每个容器上都可以运行有至少一个应用。这样,对于当前应用,在其服务请求流量大于预设流量上限值时,在将balloon移除之后,就可以通过电子设备上运行的其它应用的java堆所释放的内存对当前应用的java堆内存规格进行第二调整,以恢复当前应用的java堆内存规格。
81.示例性地,在电子设备上部署有四个容器,且该电子设备可以提供100g内存,该电子设备上部署的四个容器上分别运行有四个应用a、b、c和d,使用预设规格表示java堆足够应对峰值流量的内存大小,其中,a的java堆的预设规格为40g,日常运行所需内存为10g;b的java堆的预设规格为40g,日常运行所需内存为20g;c的java堆的预设规格为40g,日常运行所需内存为20g;d的java堆的预设规格为40g,日常运行所需内存为10g。这样,在四个应用均未处于流量峰值的情况下,其实际的java堆内存规格分别为10g、20g、20g和10g,即总共需要60g即可满足四个应用的日常运行,在四个java堆中,没有分配内存的位置分别被不同规格的balloon占据,电子设备中存在40g被java堆释放的内存。如果在某一时刻,监测到c和d的服务请求流量大于预设流量上限值,例如达到流量峰值,此时只需要将c和d的balloon移除,并将主机上闲置的40g内存分别分配给c和d的java堆,将其恢复为预设规格,就足够处理流量峰值下的服务请求;并在流量峰值结束后,再次将没有被c和d使用的空闲内存释放,以便其它应用在流量峰值时可以使用这部分内存。
82.可见,在上述示例中,对于可以提供100g内存的电子设备,如果不采用本技术实施例提供的内存伸缩管理方法,对于a、b、c和d四个应用,由于其java堆的预设规格均为40g,那么最多只能运行两个java应用;而在采用本技术实施例提供的内存伸缩管理方法后,至少可以同时运行a、b、c和d四个应用,提高了电子设备上应用部署的密度。
83.这样,在应用的服务请求流量较小时,使用balloon在java堆中占位并进行内存师傅;在服务请求流量较大时,移除balloon并恢复应用的java堆内存规格;从而实现了在电子设备上,多应用共享内存,通过对java堆内存规格根据服务请求流量进行动态伸缩,满足应用在不同服务请求流量器件的java堆内存需求,大大节省了资源。
84.本实施例提供了一种内存伸缩管理方法,通过监测当前应用的服务请求流量;当服务请求流量小于预设流量下限值时,利用balloon缩小当前应用的java堆内存规格并进行内存释放;当服务请求流量大于预设流量上限值时,移除balloon,恢复当前应用的java堆内存规格。这样,通过监测应用的服务请求流量,当检测到服务请求流量较小时,通过balloon缩小java堆内存规格并释放内存,释放出的内存可以提供给其它服务请求流量较大的应用;而当服务请求流量较大时,还可以移除balloon以恢复java堆内存规格恢复;从而通过动态调整java堆内存规格,可以实现多应用“错峰”共享内存,降低应用对物理内存的整体占用,进一步提高了应用在电子设备上的部署密度,避免内存资源浪费。另外,由于
在电子设备上预留了一部分guarantee内存,还能够在balloon失效或者应用需要执行垃圾回收时时,恢复java堆内存规格,避免发生oom导致应用被系统杀掉。而且,由于在应用运行过程中动态伸缩java堆内存规格,在流量峰值到来的时候,无需重启应用,实现了应用的热启动,使得应用可以直接达到最佳状态应对流量峰值,不会发生抖动。
85.本技术的另一实施例中,参见图2,其示出了本技术实施例提供的另一种内存伸缩管理方法的流程示意图。如图2所示,该方法可以包括:
86.s201、在主机上部署agent模块。
87.需要说明的是,参见图3,其示出了本技术实施例提供的一种容器系统的架构示意图。本技术实施例提供的内存伸缩管理方法可以基于如图3所示的容器系统来实现,该容器系统运行于电子设备上,例如运行于服务器或者主机上。如图3所示,在一电子设备上部署有若干个容器(图3中示出3个容器,但是实际数量不作具体限定),每个容器上运行有若干个应用(图中示出每个容器运行一个应用,但是实际数量不作具体限定),每个应用(在本技术实施例中,也称作java应用、java进程或者java process)都分配有一定的java堆内存;在图3中,工作内存(working memory)表示应用在运行时实际使用的内存。
88.另外,由于在本技术实施例中,应用运行在容器上,对java堆内存的伸缩也就是对容器内存的伸缩。因此,在后续描述中,有时也将释放java堆的内存写作释放容器内存,或者将伸缩java堆规格写作伸缩容器规格等等。
89.本技术实施例可以在电子设备上部署一个代理(agent,即前述实施例中的agent模块),通过agent模块管理电子设备上这一组容器的规格以及容器内应用的java堆配置,确保在该组容器在垂直缩容(即缩小容器的规格)后不发生oom。在本技术实施例中,当存在多个电子设备时,可以在每一台电子设备上均部署agent模块,分别对各电子设备进行管理。
90.在本技术实施例中,agent模块主要完成以下两个功能:一是监控应用的服务请求流量,弹性伸缩被管理容器中应用的java堆内存规格;二是分配并管理guarantee内存的使用,确保在同一个时刻只有一个容器能够获得guarantee内存(当guarantee内存较大时,也存在同一时刻有多个容器使用guarantee内存的可能性)。
91.s202、agent模块在电子设备中保留guarantee内存。
92.需要说明的是,在本技术实施例中,通过agent模块在电子设备中保留一定大小的guarantee内存,guarantee内存就是指在主机预留的一部分物理内存,可以供处于低功耗的应用在执行垃圾回收时使用。guarantee内存的大小可以结合实际使用场景进行设定,本技术实施例对此不作具体限定。通过使用guarantee内存能够保证容器在balloon机制失效时不发生oom。
93.还需要说明的是,由于balloon技术可以把java堆的内存释放掉,但使用balloon技术弹性伸缩java堆内存规格有一个前提,需要保证balloon对象不可移动,balloon对象移动会导致通过balloon释放的物理内存页重新被加载回物理内存,如果此时物理内存不足,就会发生oom。为了避免这种情况,本技术实施例提前保留一部分物理内存即guarantee内存,在容器在可能出现oom的时刻使用该内存,该guarantee内存可以被一组运行java应用的容器分时共享。
94.s203、通过balloon将java堆内存缩小并把释放的内存归还给操作系统。
95.需要说明的是,通过agent模块可以在容器中的应用的java堆中释放balloon进行占位,将存量应用中应用占用的部分java堆内存释放掉归还给操作系统,以此来降低应用的内存使用量。例如,应用开发者一开始设置8g的java堆,但是应用平时运行只需要1g的内存,那么便可以通过agent模块将多余的内存释放掉并将java堆内存规格修改成1g。由于在本技术实施例中,应用运行在容器上,且一个容器只运行一个应用,相当于将容器规格修改为1g。
96.参见图4,其示出了本技术实施例提供的一种balloon技术的工作原理示意图。balloon意为气球,气球有体积但是没有质量,这里就是指虽然在jvm的java堆中占用了一块位置,但实际不占用物理内存页,可以把这部分内存归还给操作系统方便别的java应用使用,即balloon技术可以将java堆中的内存释放并归还给操作系统。如图4所示,其中,java堆逻辑空间即表示在容器层面的内存分配情况,在实现balloon技术时,使用balloon占据预先分配的java对象,对对象的内存页标记madv

dontneed,从容器/虚拟机角度看,这部分内存已被分配占用,不会在这块内存上分配其它对象;从操作系统角度看,这部分物理内存页已被释放,可以加载其他页面,从而实现了内存的释放。另外,工作内存在物理内存中可能不连续,在图4中使用连续地址表示仅为表示方便,并不影响真实结果。
97.参见图5,其示出了本技术实施例提供的一种基于balloon技术的实现过程示意图。如图5所示,当应用处于无流量状态(即没有服务请求)需要缩减java堆大小的时候,可以通过attach的方式(即直接将代码放入正在运行的应用中,并执行操作),agent模块可以将某一规格的balloon放入到java堆中进行占位,此时,应用检测到balloon存在,就不会再使用那块java堆内存,然后把balloon占用的内存归还给操作系统。当服务请求流量来临需要增加java堆大小的时候,再通过attach技术将java堆内的balloon移除,java应用检测到balloon不再存在,就会重新使用全部的java堆,从而实现java堆的弹性伸缩。
98.s204、agent模块监控服务请求流量和垃圾回收信号。
99.需要说明的是,一方面,当agent模块监控到大量服务请求流量到来,即服务请求流量大于预设流量上限值,例如达到流量峰值时,就移除java堆中的balloon,恢复java堆内存规格;另一方面,当agent模块监控到应用发送的full gc信号,就尝试获取资源锁,如果得到资源锁则允许应用进行垃圾回收,否则继续等待直至获取资源锁后再允许应用进行垃圾回收。
100.还需要说明的是,资源锁是对guarantee内存的限制,用于保证在同一时刻,只有一个容器能够获得guarantee内存。也就是说,如果有多个应用都发出full gc信号,那么guarantee可以按照应用发出信号的先后顺序,最先发出信号的应用获取资源锁,然后guarantee恢复该应用的java堆内存规格,允许其进行垃圾回收;在该应用完成垃圾回收后,再通过balloon将其使用的guarantee内存进行释放,供下一个应用进行垃圾回收时使用。
101.还需要说明的是,在本技术实施例中,guarantee内存的作用是为了防止应用进行full gc的时候会发生oom从而导致应用被操作系统杀掉。然而如果在电子设备中为每一个应用都保留一块guarantee内存,那么电子设备的内存使用率并没有降低。因此,本技术实施例还提出了一种多应用共享guarantee内存的机制,具体的实现方式如图6,其示出了本技术实施例提供的又一种内存伸缩管理方法的流程示意图,该方法以agent模块为主体进
行描述。如图6所示,该方法可以包括:
102.s601、接收应用发送的gc事件消息。
103.需要说明的是,当java应用需要执行full gc时,会向java伸缩代理发送请求消息,例如发送gc事件(gc event)消息。
104.s602、判断guarantee内存是否充足。
105.需要说明的是,agent模块在接收java应用发送的gc事件消息之后,就判断当前guarantee内存是否充足,因为存在guarantee内存被其它应用使用,不足以支持恢复当前应用的容器规格的可能。
106.如果判断结果为是,就执行步骤s603;否则,执行继续步骤s602。
107.还需要说明的是,如果guarantee内存不足,就继续执行本步骤,当其它应用将guarantee内存归还后,确定guarantee内存充足了,就执行步骤s603。
108.s603、释放guarantee内存。
109.s604、恢复应用的容器规格。
110.需要说明的是,当确定guarantee内存充足时,agent模块就将guarantee内存释放,以恢复应用的容器规格,也就是恢复应用的java堆内存规格。
111.s605、通知应用执行垃圾回收操作。
112.s606、刷新balloon。
113.s607、降低应用的容器规格。
114.s608、恢复guarantee内存。
115.需要说明的是,在应用的容器规格被恢复之后,agent模块就通知应用执行垃圾回收操作,并在应用执行垃圾回收操作之后,刷新balloon,并降低应用的容器规格,即将java堆使用的担保内存进行返还以恢复guarantee内存。
116.也就是说,为了防止多个应用同时执行full gc而造成oom,agent模块可以通过java虚拟机工具接口(java virtual machine tool interface,jvmti)在应用中添加gc回调机制,当应用发生full gc的时候首先向agent模块发送一个gc事件消息,agent模块接收到gc事件消息后去判断guarantee内存是否充足,如果guarantee内存足够的话,agent模块首先恢复应用的容器规格,然后通知应用开始执行垃圾回收操作,等应用执行完成垃圾回收后,通知agent模块执行刷新balloon操作,并降低应用的容器规格。
117.综上所述,本技术实施例主要解决在现有技术中,java应用无法动态修改java堆大小而造成大量资源浪费的问题。由于这些应用并不需要一直提供服务,但是会一直占用cpu和内存资源,而且不能在应用处于流量波谷时直接释放大部分容器的内存,对于启动耗时长的应用,在面对流量的洪峰重新申请部署容器可能就为时已晚。因此,提供了一种多机共享弹性伸缩java堆的技术,这里,“多机”即表示多虚拟/多容器,通过多机共享内存实现java堆内存规格的动态弹性伸缩,当应用不需要提供服务的时候,缩小应用的内存占用,降低容器的资源规格,这样可以明显提高资源利用率。另外,本技术实施例可以从用户态实现,无需升级或者修改操作系统内核,对java虚拟机版本和gc算法无特殊要求,无需应用定制改造,更便于升级部署。
118.如图3所示,本技术实施例可以在一台运行一组java应用容器的电子设备上部署一个agent模块,通过agent模块管理这一组容器的规格以及容器内应用的java堆配置,确
保在该组容器在垂直缩容后不发生oom。通过agent模块在容器中应用的java堆中释放balloon,可以将存量应用中java应用占用的部分java堆内存释放掉归还给操作系统,以此来降低应用的内存使用量。例如,应用开发者一开始设置8g的java堆,但是该应用平时运行只需要1g的内存,那么便可以通过agent模块将多余的内存释放掉并将容器规格修改成1g。使用guarantee内存,能够保证容器在balloon机制失效时不发生oom。在应用流量到来之前再通过agent模块移除java堆中的balloon,让应用容器恢复正常的规格。通过这种方式既利于服务商在有限的主机内部署更多的应用,又能保证流量洪峰时能够快速恢复应用的正常状态,还避免了应用冷启动时,由于没有热身而无法达到最佳水平,导致直接面对流量峰值造成的线上服务抖动问题。
119.简言之,本技术实施例提供的服务伸缩管理方法主要可以包括以下步骤:
120.步骤1、在电子设备上部署agent模块;步骤2、agent模块保留guarantee内存防止由于进行full gc时增加内存导致应用oom;步骤3、通过balloon将java堆内存缩小并把释放的内存归还系统;步骤4、agent模块监控服务请求流量和full gc信号;步骤4.1、监控到full gc信号,尝试获取资源锁,如果得到资源锁则允许应用进行垃圾回收,否则等待获取资源锁后再进行垃圾回收;步骤4.2、监控到流量峰值到来,移除balloon,恢复java堆内存。
121.可见,本技术实施例可以通过在电子设备上部署agent模块来实现同一电子设备上的不同容器应用共享java堆内存。主要技术点包括balloon技术、guarantee内存以及agent模块等。由图4可以看出,当应用处于无流量需要缩减java堆大小的时候,通过attach的方式,agent模块可以将某一规格的balloon放入到java堆中进行占位,应用检测到balloon存在,就不会再使用那块堆内存,然后把balloon占用的内存归还给操作系统。当流量来临需要增加java堆大小的时候,再通过attach技术将java堆内的balloon移除,应用检测到balloon不再存在,那么就会重新使用全部的java堆了。通过这种方式来实现java堆的弹性伸缩。
122.另外,guarantee内存的作用是为了防止应用进行full gc的时候会发生oom从而导致应用被操作系统杀掉。然而如果为每一个应用都保留一块guarantee内存,那么会发现电子设备的内存使用率并没有降低。因此,本技术实施例还提出了一种多应用共享guarantee内存的技术,具体的实现方式如图6,为了防止多个应用同时执行full gc而造成oom,agent模块通过jvmti在应用中添加了gc回调机制,即当应用发生full gc的时候会首先向agent模块发送一个gc event消息,agent模块接收到消息后去判断guarantee内存是否充足,如果guarantee内存足够的话,agent模块首先恢复应用的容器规格,然后通知应用开始执行垃圾回收操作,等执行完成后,再通知agent模块执行刷新balloon操作,并降低应用的容器规格。
123.本技术实施例提供了一种内存伸缩管理方法,通过上述实施例对前述实施例的具体实现进行了详细阐述,从中可以看出,一方面,本技术实施例提出的内存伸缩管理方法可以应用在具有明显流量错峰属性的多个应用组合部署的场景下,通过应用分时复用共享物理内存,降低应用对物理内存的整体占用,从而提高应用部署密度。另一方面,本技术实施例还提出了一种共享guarantee内存的机制来防止低功耗的容器在balloon机制失效时产生oom。其技术原理是提前保留一份guarantee内存,通过监控低功耗容器中可能导致balloon机制失效的事件,实现guarantee内存在低功耗容器中的分时复用,确保一组容器
在低功耗状态下不发生oom。简言之,本技术实施例不仅实现了java堆的动态伸缩,使得多个应用共享物理内存,提高电子设备上的应用部署密度,还通过guarantee内存机制避免了在balloon机制失效时产生oom。
124.本技术的再一实施例中,参见图7,其示出了本技术实施例提供的一种内存伸缩管理装置70的组成结构示意图。如图7所示,该内存伸缩管理装置70可以包括监测单元701和内存管理单元702,其中,
125.监测单元701,配置为监测当前应用的服务请求流量;
126.内存管理单元702,配置为当所述服务请求流量小于预设流量下限值时,利用balloon缩小所述当前应用的java堆内存规格并进行内存释放;以及当所述服务请求流量大于预设流量上限值时,移除所述balloon,恢复所述当前应用的java堆内存规格。
127.在一些实施例中,内存管理单元702,还配置为利用所述balloon在所述当前应用的java堆中进行位置占用,释放被所述balloon占用的空闲内存,并对所述当前应用的java堆内存规格进行第一调整;其中,所述第一调整用于指示缩小所述当前应用的java堆内存规格。
128.在一些实施例中,所述电子设备70中部署有代理agent模块;内存管理单元702,还配置为通过所述agent模块监测所述当前应用的服务请求流量。
129.在一些实施例中,内存管理单元702,还配置为通过所述agent模块预留guarantee内存;其中,所述guarantee内存用于确保所述电子设备在所述当前应用的java堆中移除所述balloon或者监测到垃圾回收full gc信号时不会出现内存溢出现象。
130.在一些实施例中,内存管理单元702,还配置在移除所述balloon后,将所述guarantee内存分配给所述当前应用的java堆,并对所述当前应用的java堆内存规格进行第二调整,以恢复所述当前应用的java堆内存规格;其中,所述第二调整用于指示增大所述当前应用的java堆内存规格。
131.在一些实施例中,内存管理单元702,还配置为通过所述agent模块监测到full gc信号后,判断所述guarantee内存是否满足预设条件;以及若所述guarantee内存满足预设条件,则利用所述guarantee内存恢复所述当前应用的java堆内存规格,并通知所述当前应用执行垃圾回收操作;以及若所述guarantee内存不满足预设条件,则继续执行所述判断所述guarantee内存是否满足预设条件的步骤。
132.在一些实施例中,内存管理单元702,还配置为若所述guarantee内存大于或等于恢复所述当前应用的java堆内存规格所需的内存,则确定所述guarantee内存满足预设条件;以及若所述guarantee内存小于恢复所述当前应用的java堆内存规格所需的内存,则确定所述guarantee内存不满足预设条件
133.在一些实施例中,内存管理单元702,还配置为在所述当前应用执行垃圾回收操作后,通过所述agent模块执行刷新所述balloon的操作,缩小所述当前应用的java堆内存规格并进行内存释放,以恢复所述guarantee内存。
134.在一些实施例中,所述电子设备70中部署有若干个容器,每一容器上运行的应用数量为至少一个;内存管理单元702,还配置为获取所述若干个容器上运行的应用利用所述balloon释放的物理内存;以及在移除所述balloon后,将所述物理内存分配给所述当前应用的java堆,并对所述当前应用的java堆内存规格进行第二调整,以恢复所述当前应用的
java堆内存规格;其中,所述第二调整用于指示增大所述当前应用的java堆内存规格。
135.可以理解地,在本实施例中,“单元”可以是部分电路、部分处理器、部分程序或软件等等,当然也可以是模块,还可以是非模块化的。而且在本实施例中的各组成部分可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
136.所述集成的单元如果以软件功能模块的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
137.因此,本实施例提供了一种计算机存储介质,该计算机存储介质存储有计算机程序,所述计算机程序被至少一个处理器执行时实现前述实施例中任一项所述内存伸缩管理方法的步骤。
138.本技术的再一实施例中,基于上述的一种内存伸缩管理装置70的组成以及计算机存储介质,参见图8,其示出了本技术实施例提供的一种电子设备80的组成结构示意图。如图8所示,该电子设备80至少包括前述实施例中任一项所述的内存伸缩管理装置70。
139.本技术的再一实施例中,参见图9,其示出了本技术实施例提供的一种电子设备80的具体硬件结构示意图。如图9所示,可以包括:通信接口801、存储器802和处理器803;各个组件通过总线系统804耦合在一起。可理解,总线系统804用于实现这些组件之间的连接通信。总线系统804除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图8中将各种总线都标为总线系统804。其中,通信接口801,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;
140.存储器802,用于存储能够在处理器803上运行的计算机程序;
141.处理器803,用于在运行所述计算机程序时,执行:
142.监测当前应用的服务请求流量;
143.当所述服务请求流量小于预设流量下限值时,利用内存气球balloon缩小所述当前应用的java堆内存规格并进行内存释放;
144.当所述服务请求流量大于预设流量上限值时,移除所述balloon,恢复所述当前应用的java堆内存规格。
145.可以理解,本技术实施例中的存储器802可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read

only memory,rom)、可编程只读存储器(programmable rom,prom)、可擦除可编程只读存储器(erasable prom,eprom)、电可擦除可编程只读存储器(electrically eprom,eeprom)或闪存。易失性存储器可以是随机存取存储器(random access memory,ram),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器
(static ram,sram)、动态随机存取存储器(dynamic ram,dram)、同步动态随机存取存储器(synchronous dram,sdram)、双倍数据速率同步动态随机存取存储器(double data rate sdram,ddrsdram)、增强型同步动态随机存取存储器(enhanced sdram,esdram)、同步链动态随机存取存储器(synchronous link dram,sldram)和直接内存总线随机存取存储器(direct rambus ram,drram)。本文描述的系统和方法的存储器802旨在包括但不限于这些和任意其它适合类型的存储器。
146.而处理器803可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器803中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器803可以是通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本技术实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器802,处理器803读取存储器802中的信息,结合其硬件完成上述方法的步骤。
147.可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(application specific integrated circuits,asic)、数字信号处理器(digital signal processing,dsp)、数字信号处理设备(dsp device,dspd)、可编程逻辑设备(programmable logic device,pld)、现场可编程门阵列(field

programmable gate array,fpga)、通用处理器、控制器、微控制器、微处理器、用于执行本技术所述功能的其它电子单元或其组合中。
148.对于软件实现,可通过执行本文所述功能的模块(例如过程、函数等)来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。
149.可选地,作为另一个实施例,处理器803还配置为在运行所述计算机程序时,执行前述实施例中任一项所述的方法。
150.对于电子设备80而言,由于通过监测应用的服务请求流量,当监测到服务请求流量较小时,通过balloon缩小java堆内存规格并释放内存,释放出的内存可以提供给服务请求流量较大的其它应用;而当监测到服务请求流量较大时,还可以移除balloon以恢复java堆内存规格;从而通过动态调整java堆内存规格,可以实现多应用“错峰”共享内存,降低应用对物理内存的整体占用,进而提高了应用在电子设备上的部署密度,避免内存资源浪费。
151.以上所述,仅为本技术的较佳实施例而已,并非用于限定本技术的保护范围。
152.需要说明的是,在本技术中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括
该要素的过程、方法、物品或者装置中还存在另外的相同要素。
153.上述本技术实施例序号仅仅为了描述,不代表实施例的优劣。
154.本技术所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。
155.本技术所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。
156.本技术所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。
157.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
再多了解一些

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

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

相关文献