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

一种JAVA虚拟机内存分配系统及方法与流程

2022-03-16 01:07:10 来源:中国专利 TAG:

一种java虚拟机内存分配系统及方法
技术领域
1.本发明涉及计算机信息技术领域,具体涉及一种java虚拟机内存分配系统及方法。


背景技术:

2.在一个大型的面向java语言开发的解决方案系统中,涉及多个java进程(简称组件)协作形成应用系统,这就涉及到需要为不同的组件分配jvm内存。现有技术中通常采用的分配方式是预先指定每个组件所需的内存最小值及最大值。该分配方式存在以下问题:
3.(1)不同的应用场景,系统需要满足的规格不同,导致各组件所需的内存大小不同,预先指定各组件内存的方式无法满足不同场景因规格变化导致的组件内存需求差异;导致需要针对不同的应用场景手工配置不同组件的内存值,同时需要为不同应用场景提供不同的版本,系统无法较好的做到通用性适配。
4.(2)当系统中有组件增减时,需要人为地重新为所有组件分配内存,否则可能出现组件内存分配不合理的情况。特别是通过license(授权许可)控制某些组件不启动时,无法人为干预的情况下,其它启动的组件无法享用空余出来的内存,存在内存充足但性能无法满足要求的情况。
5.(3)对于一些测试或试用版本,在客户测试环境中服务器资源受限情况下,无法自动缩减组件的内存占用,导致无法正常测试。
6.(4)由于不同的特定场景分配的内存并不能简单的合并形成混合场景的内存分配,在一些混合应用场景中,将导致系统弹性能力急剧下降。
7.因此,如何实现不同应用场景下的内存资源的动态、合理化分配,满足应用场景变化需求,是当前亟待解决的技术问题。


技术实现要素:

8.本发明所要解决的技术问题是:提出一种java虚拟机内存分配系统及方法,实现不同应用场景下的内存资源的动态、合理化分配,满足应用场景变化需求。
9.本发明解决上述技术问题采用的技术方案是:
10.一方面,本发明实施例提供了一种java虚拟机内存分配系统,包括:
11.第一确定模块,用于根据部署的应用软件系统的规格指标确定所述应用软件系统的各自带组件需要占用的内存值;
12.第二确定模块,用于确定第三方组件在所述应用软件系统各自带组件的所有规格指标项下需要占用的内存值;
13.内存分配模块,用于根据确定的所述应用软件系统的各自带组件需要占用的内存值和第三方组件需要占用的内存值分别为对应组件分配内存值。
14.作为进一步优化,所述内存分配模块还用于:根据所述应用软件系统各自带组件需要占用的内存值、第三方组件需要占用的内存值以及所述应用软件系统的操作系统需要
占用的内存计算应用软件系统需要占用的总内存;
15.根据实际应用场景提供的物理内存与应用软件系统需要占用的总内存求取剩余内存;
16.将剩余内存分配给所述应用软件系统的自带组件和第三方组件。
17.作为进一步优化,所述第一确定模块,具体用于:
18.确定应用软件系统的各自带组件在其基线规格下占用的基线内存值;
19.根据部署的应用软件系统的实际规格指标项与对应基线规格下占用的基线内存值确定各自带组件实际需要占用的内存值。
20.作为进一步优化,所述确定应用软件系统的各自带组件在其基线规格下占用的基线内存值的方法包括:
21.在应用软件系统出厂前,多次分别采样系统各自带组件的内存占用值;
22.求取系统各自带组件下的影响内存资源占用的基线规格指标项的内存占用平均值;
23.通过对各自带组件下的所有基线规格指标项的内存占用平均值进行求和,获取对应自带组件在其基线规格下占用的基线内存值。
24.作为进一步优化,所述第二确定模块,具体用于:
25.根据第三方组件对内存的占用与所述自带组件在其对应规格指标项下占用的内存之间的比例关系,求取第三方组件在系统各自带组件的所有规格指标项下需要占用的内存值。
26.另一方面,本发明的实施例还提供了一种java虚拟机内存分配方法,包括以下步骤:
27.a.根据部署的应用软件系统的规格指标确定所述应用软件系统的各自带组件需要占用的内存值;
28.b.确定第三方组件在应用软件系统各自带组件的所有规格指标项下需要占用的内存值;
29.c.根据确定的所述应用软件系统的各自带组件需要占用的内存值和第三方组件需要占用的内存值分别为对应组件分配内存值。
30.作为进一步优化,该方法还包括步骤:
31.d.根据所述应用软件系统各自带组件需要占用的内存值、第三方组件需要占用的内存值以及所述应用软件系统的操作系统需要占用的内存计算应用软件系统需要占用的总内存;
32.根据实际应用场景提供的物理内存与应用软件系统需要占用的总内存求取剩余内存;
33.将剩余内存分配给所述应用软件系统的自带组件和第三方组件。
34.作为进一步优化,步骤a具体包括:
35.a1.确定应用软件系统的各自带组件在其基线规格下占用的基线内存值;
36.a2.根据部署的应用软件系统的实际规格指标项与对应基线规格下占用的基线内存值确定各自带组件实际需要占用的内存值。
37.作为进一步优化,步骤a1具体包括:
38.a11.在应用软件系统出厂前,多次分别采样系统各自带组件的内存占用值:
39.假设应用软件系统包括n个组件,其中cn表示第n个组件,cn组件下影响其内存占用的基线规格指标有m个,jm(cn)表示cn组件的第m个基线规格指标;
40.通过多次分别采样系统各自带组件的内存占用值,其中第k次采样获取的cn组件的内存占用值为gk(cn);
41.a12.求取系统各自带组件下的影响内存资源占用的基线规格指标项的内存占用平均值:
42.cn组件的第m个基线规格指标项jm(cn)的内存占用平均值g(jm(cn))的计算方式为:
[0043][0044]
a13.通过对各自带组件下的所有基线规格指标项的内存占用平均值进行求和,获取对应自带组件在其基线规格下占用的基线内存值:
[0045]
cn组件在其基线规格下占用的基线内存值g(cn)的计算方式为:
[0046][0047]
作为进一步优化,步骤a2中,所述确定各自带组件实际需要占用的内存值具体包括:
[0048]
对于cn组件,其实际需要占用的内存值g

(cn)的计算方式为:
[0049][0050]
其中,sm(cn)为实际应用场景下应用软件系统的组件cn的第m个规格指标。
[0051]
作为进一步优化,步骤b具体包括:
[0052]
根据第三方组件对内存的占用与所述自带组件在其对应规格指标项下占用的内存之间的比例关系,求取第三方组件在系统各自带组件的所有规格指标项下需要占用的内存值:
[0053][0054]
其中,g

(tn)为第三方组件在cn组件所有规格指标项下实际需要占用的内存值,rm表示第三方组件与cn组件中第m个规格指标项所占用内存的比例关系。
[0055]
作为进一步优化,步骤d中,所述应用软件系统需要占用的总内存计算方式为:
[0056][0057]
其中,g

为应用软件系统需要占用的总内存,gs为实际应用场景提供的物理内存,rs为操作系统需要占用的内存在物理内存中的占比;
[0058]
所述剩余内存的计算方式为:
[0059]
l=gs-g


[0060]
所述将剩余内存分配给所述应用软件系统的自带组件和第三方组件的计算方式
为:
[0061]
将第三方组件视为一个组件,该组件与各个自带组件平均分配剩余内存l。
[0062]
本发明的有益效果是:
[0063]
1、可以根据客户实际场景中的不同规格需求,或者是license控制的授权规格数量,对系统所需占用的内存进行动态的计算,可以适应独立解决方案场景和混合解决方案场景等不同场景下的授权差异;
[0064]
2、可以根据规格,计算得到系统必须支持的规格指标值,并根据规格指标值计算出所需的内存资源,如果当前资源不足,可以向客户提前提出资源诉求,可以比较明确的给出所需内存资源大小;当前资源充足时,可以充分利用富余的内存,提升系统性能;
[0065]
3、可以合理的分配整个系统各组件所需的内存,避免分配不当造成有的组件内存不足导致系统崩溃,有的组件内存分配过大导致内存资源严重浪费。
附图说明
[0066]
图1为本发明中的java虚拟机内存分配系统结构框图;
[0067]
图2为本发明中的java虚拟机内存分配方法流程图。
具体实施方式
[0068]
本发明旨在提出一种java虚拟机内存分配系统及方法,实现不同应用场景下的内存资源的动态、合理化分配,满足应用场景变化需求。基础思想是:应用软件系统的运行必将占用内存,并且内存的占用与该系统的规格指标存在比例关系,因此,本发明根据组件需要满足的不同应用场景的规格自动计算其内存占用值,从而形成整个系统在该场景及对应规格下必须的内存值。
[0069]
如图1所示,本发明中的java虚拟机内存分配系统包括第一确定模块、第二确定模块和内存分配模块;
[0070]
第一确定模块用于根据在实际应用场景下部署的应用软件系统的规格指标确定所述应用软件系统的各自带组件需要占用的内存值;
[0071]
第二确定模块,用于确定第三方组件在所述应用软件系统各自带组件的所有规格指标项下需要占用的内存值;
[0072]
内存分配模块,用于根据确定的所述应用软件系统的各自带组件需要占用的内存值和第三方组件需要占用的内存值分别为对应组件分配内存值。
[0073]
在实际场景中,在分配内存后,若物理内存仍然有剩余,则可以将剩余内存分配给各个组件从而提高系统的性能,由此,所述内存分配模块还用于:
[0074]
根据所述应用软件系统各自带组件需要占用的内存值、第三方组件需要占用的内存值以及所述应用软件系统的操作系统需要占用的内存计算应用软件系统需要占用的总内存;
[0075]
根据实际应用场景提供的物理内存与应用软件系统需要占用的总内存求取剩余内存;
[0076]
将剩余内存分配给所述应用软件系统的自带组件和第三方组件。
[0077]
基于上述内存分配系统,本发明实现的java虚拟机内存分配方法如图2所示,其包
括以下步骤:
[0078]
步骤1:根据在实际应用场景下部署的应用软件系统的规格指标确定所述应用软件系统的各自带组件需要占用的内存值;
[0079]
本步骤中,首先确定应用软件系统的各自带组件在其基线规格下占用的基线内存值;
[0080]
然后,根据在实际应用场景下部署的应用软件系统的实际规格指标项与对应基线规格下占用的基线内存值确定各自带组件实际需要占用的内存值。
[0081]
假定应用软件系统是由n个组件组成,并且cn代表第n个组件;假定组件cn在出厂时的基线规格指标(是指产品在出厂时具备的普适性应用场景下的规格指标值)为j(cn);假定组件cn在基线规格指标j(cn)下的内存占用为g(j(cn));
[0082]
一般而言,某个基线规格均与构成该基线规格的数据结构相关,其内存占用也与该数据结构的内存占用存在对应关系,假定构成基线规格指标的主要数据结构在单数据时占用的内存是b字节,那么理论上在j(cn)规格下所需的内存为gb(j(cn))=j(cn)*b字节。例如:某基线规格为可管理的用户数100个,每个用户数据占用的内存为200字节,那么该基线规格下理论上所需的内存为100*200字节;
[0083]
然而,需要注意的是,该数据是理论数据,在实际应用中,受开发人员技能水平及业务逻辑复杂度、部署应用系统的服务器性能等因素影响,实际上还可能存在相同数据多次冗余存储或者临时存储,或者因程序处理缓慢导致内存堆积的情况,所以实际内存占用与理论数据是不一致的。所以需要在系统发布前,预先测试模拟多组数据进行平均采样取值,以获得尽量准确的基线内存值。
[0084]
假定组件cn影响其内存占用的规格指标项有m个,jm(cn)表示cn组件的第m个基线规格指标;假定进行k次采样,对于cn组件每次采样的内存结果为gk(cn);
[0085]
接着,我们就可以求取系统各自带组件下的影响内存资源占用的基线规格指标项的内存占用平均值:
[0086]
cn组件的第m个基线规格指标项jm(cn)的内存占用平均值g(jm(cn))的计算方式为:
[0087][0088]
其中,gk(jm(cn))表示第k次采样中cn组件的第m个基线规格指标的内存占用值,由于该值采样获取比较困难,我们可以采用各指标项之间理论内存比例来进行换算,公式如下:
[0089][0090]
其中,bm为第m个指标项中单个数据结构所需占用内存的理论值。
[0091]
在利用gk(jm(cn))计算获取cn组件的第m个基线规格指标项jm(cn)的内存占用平均值g(jm(cn))之后,我们就可以对各自带组件下的所有基线规格指标项的内存占用平均值进行求和,获取对应自带组件在其基线规格下占用的基线内存值:
[0092]
cn组件在其基线规格下占用的基线内存值g(cn)的计算方式为:
[0093][0094]
步骤2:确定第三方组件在应用软件系统各自带组件的所有规格指标项下需要占用的内存值;
[0095]
假定在构成应用软件系统的组件还包括一些被依赖的第三方组件(这里将所有第三方组件看成一个组件,便于计算内存关系,当然也可以按照构成应用系统的自带组件那样去细分,只是稍复杂一些,并且实际使用中除缓存外的第三方组件并不是内存占用的主体,所以考虑的必要性也不太大),例如:缓存redis组件等,假定这些组件对内存的占用与系统的规格指标项存在一定的比例关系,那么第三方组件占用的内存为:
[0096][0097]
其中rm表示第三方组件与cn组件中第m个规格指标项所占用内存的比例关系,为0时表示没有关系,g(tn)表示第三方组件在cn组件所有规格指标项下占用内存的总和。
[0098]
步骤3:根据确定的所述应用软件系统的各自带组件需要占用的内存值和第三方组件需要占用的内存值分别为对应组件分配内存值;
[0099]
本步骤中,在实际应用场景中,我们就可以根据计算的各个组件需要占用的内存为其分配对应内存大小。
[0100]
步骤4:计算应用软件系统需要占用的总内存,根据实际应用场景提供的物理内存与应用软件系统需要占用的总内存求取剩余内存;将剩余内存分配给所述应用软件系统的自带组件和第三方组件。
[0101]
应用软件系统需要的内存除了自带组件内存占用和第三方组件内存占用外,还包括操作系统需要占用的内容,我们假定操作系统需要占用的内存固定为服务器物理内存的rs%,则可以计算应用软件系统占用的内存为:
[0102][0103]
gs表示服务器物理内存总量。
[0104]
由此,我们计算出了应用软件系统占用的内存需求。
[0105]
在实际应用场景中,若用户提供的物理内存在满足应用软件系统占用的内存需求外,仍有裕量,则可以将剩余内存分配给各个组件,从而提升系统性能。
[0106]
具体而言,剩余内存=实际物理内存-应用软件系统占用的内存;我们将第三方组件视为一个组件,则加上应用软件系统自带n个组件,共有n 1个组件,我们将剩余内存平均分配给此n 1个组件即可。
[0107]
实施例:
[0108]
假定某应用软件系统有a、b两个组件组成,并使用了第三方组件c。假定组件a影响内存资源占用的基线规格指标有两个,分别为指标1和指标2:指标1是访问系统的用户数,假定为1000个用户;指标2是可管理的用户终端数,假定为2000台终端;假定组件b影响内存资源占用的基线规格指标有1个,假定为指标3,指标3是可管理的设备数,假定为5000台设备;假定第三方组件c用于缓存用户、终端、设备等数据,便于加快系统的查询速度,假定用户数据全部存储,其缓存内存占用比例为100%,假定终端数据只有20%的内容需要存储到
缓存中,设备数据只有50%需要存储到缓存中。假定指标1涉及的数据结构主要是用户数据结构,由用户数据元信息组成,例如:用户名、用户电话、用户地址等信息,根据组成用户数据结构的元信息可以简单计算出单个用户数据结构需要占用的内存大小。假定单个用户数据占用200字节内存;假定单个终端数据占用500字节内存;假定单个设备数据占用1000字节内存。
[0109]
在系统出厂前假设进行了5次采样,组件a和组件b的采样结果如下:
[0110]
表1:组件a采样结果
[0111]
采样次数组件占用内存(单位mb)第一次64第二次66第三次62第四次68第五次67
[0112]
表2:组件b采样结果
[0113]
采样次数组件占用内存(单位mb)第一次70第二次72第三次78第四次75第五次74
[0114]
根据以下公式可以计算每次采样时,对应指标项占用的内存基线值:
[0115][0116]
以指标1第一次采样为例,其计算方法是:
[0117]
64mb*(1000个用户数据*200字节/每个用户数据
÷
(1000个用户数据*200字节/每个用户数据 2000台终端数据*500字节/每台终端数据))=64mb*(2/12)=10.7mb
[0118]
通过此方法可以计算出组件中的指标项的各次采样结果:
[0119]
表3:组件a各指标项各次采样结果
[0120]
采样次数指标1占用的内存值(mb)指标2占用的内存值(mb)第一次10.753.3第二次1155第三次10.351.7第四次11.356.7第五次11.255.8
[0121]
由此可根据以下公式
[0122][0123]
计算出组件a在指标1下的平均采样值为:g(j1(ca))=(10.7 11 10.3 11.3
11.2)/5=10.9mb,同理可计算出组件a在指标2下的平均采样值为g(j2(ca))=54.5mb
[0124]
组件b只有1个指标项即指标3,所以组件b的指标3采样数据即为组件b的采样数据。那么组件b在指标3下的平均采样值为:g(j3(cb))=73.8mb
[0125]
根据以下公式:
[0126][0127]
可计算出在出厂时,基于出厂的基线规格,系统自带组件占用的基线内存为:
[0128]
g(j1(ca)) g(j2(ca)) g(j3(cb))=139.2mb
[0129]
第三方组件需要的内存,通过以下公式计算:
[0130][0131]
按照假定条件,用户数据全部存储,其缓存内存占用比例为100%,假定终端数据只有20%的内容需要存储到缓存中,设备数据只有50%需要存储到缓存中,那么第三方组件在出厂时基线内存要求是:
[0132]
g(j1(ca))*100% g(j2(ca))*20% g(j3(cb))*50%=10.9*100% 54.5*20% 73.8*50%=58.7mb
[0133]
那么,在应用软件系统出厂时,在出厂规格指标下,至少需要的物理内存为:
[0134][0135]
即:g(cn) g(tn)=139.2 58.7=197.9mb,假设系统10%的物理内存提供给操作系统使用,那么至少需要客户提供256mb的物理内存。
[0136]
假定在某客户场景中,客户提供了32g内存的服务器用于部署应用软件系统。假定实际指标1是管理20000个用户,指标2是管理40000个终端,指标3是管理10000台设备。
[0137]
根据以下公式可以计算出在用户要求的规格下,系统自带组件需要实际占用的内存:
[0138][0139][0140]
第三方组件需要占用的内存为:
[0141][0142]
那么,在该客户的应用场景中,应用软件系统在客户规格指标下,至少需要的物理内存为:
[0143][0144]
即:1455.6 509.8=1965.4mb,假设系统10%的物理内存提供给操作系统使用,那么至少需要客户提供2.5g以上的物理内存。
[0145]
实际上客户提供了32g的物理内存,那么剩余的内存可以平均分配给各组件,以便提升系统运行性能,假定按照10%将物理内存分配给操作系统,那么在满足应用软件系统运行的基础内存要求上,还剩余:l=32*1024mb*(1-10%)-1965.4mb=27525.8mb
[0146]
由公式:gt(cn)=g

(cn) l/(n 1),其中n 1表示n个自带组件加1个统一的第三方组件,
[0147]
可以得出,组件a可以实际分配的内存大小为:
[0148]
gt(ca)=g

(ca) l/(n 1)
[0149]
=s1(ca)*g(j1(ca))/j1(ca) s2(ca)*g(j2(ca))/j2(ca) l/(n 1)
[0150]
=20000*10.9/1000 40000*54.5/2000 27525.8/(2 1)
[0151]
=1308 9175.3
[0152]
=10483.3mb
[0153]
组件b可以实际分配的内存大小为:
[0154]
gt(cb)=g

(cb) l/(n 1)
[0155]
=s3(cb)*g(j3(cb))/j3(cb) l/(n 1)
[0156]
=10000*73.8/5000 27525.8/(2 1)
[0157]
=147.6 9175.3
[0158]
=9322.9mb
[0159]
第三方组件可以分配的内存为:
[0160]
gt(tn)=g

(tn) l/(n 1)
[0161]
=509.8 9175.3
[0162]
=9685.1mb
[0163]
最终,在客户场景中,在指定的指标项和客户提供的物理内存下,各组件以及操作系统内存分配为下表所示:
[0164]
表4:各组件及操作系统内存分配表
[0165][0166]
至此,本实施例实现了内存资源的动态、合理化分配。
再多了解一些

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

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

相关文献