一种启动应用程序的方法及其装置与流程

文档序号:18463771发布日期:2019-08-17 02:16阅读:210来源:国知局
一种启动应用程序的方法及其装置与流程

本发明涉及互联网技术领域,具体涉及一种启动应用程序的方法以及一种启动应用程序的装置。



背景技术:

随着如docker、ixc等的容器技术在近年的快速发展,越来越多的服务端应用程序运行到了应用容器中,而对于使用java语言的程序,其应用容器需要运行于java虚拟机环境中,java虚拟机包含了java程序运行的各项参数,如最大内存、堆内存、垃圾回收机制等等。而容器技术为java虚拟机引入了新的内存管理方式,比如管理人员在一台宿主机上启动一个应用容器时,其会根据实际的内存使用情况给该应用容器分配预定的内存配额,但是由于在java语言的发展之初,现有的容器技术并未诞生,故运行于应用容器内的在运行时默认以宿主机的内存容量来配置内存限制值的java程序无法同时读取应用容器中的内存配额,而应用容器的内存配额一般都会小于宿主机的内存容量;因此,java程序在运行的时候容易会产生其占用内存值大于该应用容器的内存配额的现象,从而导致内存耗尽,进而导致容器及其内部的应用程序被关掉。

在现有技术中,为了能避免上述因内存耗尽,进而导致应用容器及其内部的应用进程被关掉的现象发生,其一般通过手动设置的方式来设置java程序的内存限制值,来避免应用容器内存溢出的问题。但是现有技术的一个缺点就是,必须为每个运行在应用容器里的java程序,手动设置内存限制值,由于所有应用容器的内存配额均不是固定的,当java程序非常多的时候,手动为每个java程序设置内存限制值的方式非常不便后期维护,容易出现配置错误。而且由于应用容器内存是可以改变的,当管理人员根据实际访问量对应用容器的内存配额进行调小后,这时如果忘了重新设置java程序的内存限制值,就会发生内存泄漏的情况。故在现有技术采用手动设置的方式其设置工作量大,维护并不容易,且容易引起漏设置,造成内存泄漏的情况的发生。



技术实现要素:

为克服上述缺陷,本发明的目的即在于如何在不改变应用程序运行环境的基础上,对封装在应用容器中的应用程序控制内存限额,以避免应用容器出现内存溢出的方法及其装置。

本发明的目的是通过以下技术方案来实现的:

本发明是一种启动应用程序的方法,包括:

在应用程序置入到应用容器内的情况下,分别获取所述应用容器的内存配额和宿主机的内存容量;

比较所述内存配额与所述内存容量之间的大小,以两者中较小的值作为调整值并生成携带所述调整值的内存调整命令,所述内存调整命令用于将所述应用程序的内存限制值调整为与所述调整值相一致;

启动所述应用程序且为所述应用程序加载所述内存调整命令。

在本发明中,在应用程序置入到应用容器内的情况下,分别获取所述应用容器的内存配额和宿主机的内存容量,包括:

当所述应用容器运行时,所述应用程序中的第一应用程序从所述宿主机的内存容量;

与所述第一应用程序不同的第二应用程序在所述应用容器中读取所述内存配额。

在本发明中,所述分别获取所述应用容器的内存配额和宿主机的内存容量之前包括:

当所述应用容器运行时,检测所述应用程序的运行环境参数,并通过所述运行环境参数判断所述应用程序是否置入到所述应用容器内;

若所述应用程序没有置入到所述应用容器内,则直接启动所述应用程序中的;

若所述应用程序置入到所述应用容器内,则通过所述应用程序中的第一应用程序读取所述内存容量且通过与所述第一应用程序不同的第二应用程序读取所述内存配额。

在本发明中,所述分别获取所述应用容器的内存配额和宿主机的内存容量之后还包括:

若所述应用容器的内存配额不存在,则直接启动所述应用程序。

在本发明中,所述检测应用程序的运行环境参数之前包括:

创建一个应用容器,在所述应用容器创建完成后,对所述应用容器进行初始化。

在本发明中,所述通过所述运行环境参数判断应用程序是否置入到应用容器内包括:

在所述运行环境参数中查找配置文件,若查找到所述配置文件,则应用程序置入到应用容器内;若查找不到所述配置文件,则应用程序没有置入到应用容器内。

本发明是一种启动应用程序的装置,包括:

容器内存获取模块,所述容器内存获取模块用于获取供所述应用程序运行的应用容器的内存配额;

主机内存获取模块,所述主机内存获取模块用于获取宿主机的内存容量;

调整值获取模块,所述调整值获取模块分别与所述容器内存获取模块和所述主机内存获取模块相连接,用于比较所述内存配额与所述内存容量之间的大小,并以两者中较小的值作为调整值;

调整命令生成模块,所述调整命令生成模块与所述调整值获取模块相连接,用于根据所述调整值生成内存调整命令,所述内存调整命令用于将所述应用程序的内存限制值调整为与所述调整值的大小相一致;

调整命令加载模块,所述调整命令加载模块与所述调整命令生成模块相连接,用于在应用程序启动模块中加载上所述内存调整命令;

应用程序启动模块,所述应用程序启动模块与所述调整命令加载模块相连接,用于对所述应用程序进行启动。

在本发明中,所述装置还包括:

环境参数检测模块,所述环境参数检测模块用于检测应用程序的运行环境参数;

运行环境判断模块,所述运行环境判断模块与所述环境参数检测模块相连接,用于根据检测到的运行环境参数判断所述应用程序是否置入到应用容器内,若应用程序是否置入到应用容器内,则驱动容器内存获取模块和主机内存获取模块。

在本发明中,所述装置还包括:

容器创建模块,所述容器创建模块用于对应用容器进行创建;

容器内存设定模块,所述容器内存设定模块与所述容器创建模块相连接,用于对所述应用容器的内存配额进行设定。

在本发明中,所述运行环境判断模块包括:

配置文件查找单元,所述配置文件查找单元用于在所述运行环境参数中对配置文件进行查找;

运行判断单元,所述运行判断单元与所述配置文件查找单元相连接,用于根据配置文件的查找结果,对应用程序是否置入到应用容器内进行判断。

本发明的启动应用程序的方法,其在启动应用程序之前,先对应用容器的内存配额和宿主机中内存容量比较,以较小值生成对应用程序的内存限制值进行调整的命令,并在应用程序启动时将该命令与应用程序一同进行加载,有效地避免了容器发生内存溢出,其不需要对应用程序的内存限制值进行手动设置,有效地减少了用户人工设置的工作量,使其维护较为容易,且不会存在引起漏设置的现象发生。

附图说明

为了易于说明,本发明由下述的较佳实施例及附图作详细描述。

图1为本发明方法一个实施例的工作流程示意图;

图2为本发明方法另一个实施例的工作流程示意图;

图3为本发明装置一个实施例的逻辑结构示意图;

图4为本发明装置另一个实施例的逻辑结构示意图;

图5为本发明装置中的运行环境判断模块的逻辑结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”、“顺时针”、“逆时针”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个所述特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接。可以是机械连接,也可以是电连接。可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

下面以java语言环境为例以一个实施例对本发明的一种启动应用程序的方法进行具体描述,请参阅图1,其应用程序包括java程序,其包括:

s101.获取内存配额和内存容量

在应用程序置入到应用容器内的情况下,分别获取所述应用容器的内存配额和宿主机的内存容量;其中,宿主机的内存容量为宿主机的物理内存量;

应用程序可以包括java程序(为了便于描述,下称第一应用程序,如demo.jar)和java内存调整程序(为了便于描述,下称第二应用程序,如:set-jvm),在容器初始化到第一应用程序启动之前,第二应用程序从应用容器中读取内存配额,第一应用程序被配置为从宿主机的操作系统中读取内存容量,可以在保持第一应用程序运行环境的基础上,应用程序自动得到应用容器中的内存配额。

s102.确定调整值

比较所述内存配额与所述内存容量之间的大小,并以两者中较小的值作为调整值;例如:将宿主机的内存容量4096m和应用容器的内存配额1024m进行比较,将两个值中的较小值1024m作为调整值;

第一应用程序和第二应用程序之间通信交互,将内存容量传输给第二应用程序,进而判断内存容量和内容配额之间的大小;或者第三应用程序分别调用与其不同的第一应用程序和第二应用程序,分别接收内存配额和内存容量,在第三方应用程序中比较两者的大小。

s103.生成内存调整命令

根据所述调整值生成内存调整命令,所述内存调整命令用于将所述java程序的内存限制值调整为与所述调整值的大小相一致;即生成将java程序的内存限制值调整为1024m的命令;

s104.在启动时加载内存调整命令

在启动所述java程序的同时对所述内存调整命令进行加载,即在启动java程序的同时,执行将java程序的内存限制值调整为1024m的命令。

由于java程序自身特点限定了其默认会以宿主机的内存容量来配置其内存限制值,故在现有技术中,如宿主机的内存容量为4096m,则java程序的内存限制值会调整为4096m,但如果此时的放置该java程序的应用容器的内存配额仅为1024m,其容易因java程序的内存溢出而导致java程序被关掉,而本发明根据应用容器的内存配额而生成对应的调整值,如:应用容器的内存配额为1024m,则调整值也对应为1024m;并在java程序启动时加载内存调整命令,使得java程序以1024m的内存值进行运行,以保证java程序的运行内存值不会超过应用容器的内存配额,有效地防止内存溢出,而导致java程序被关掉的情况发生。

第二应用程序以调整值封装内存调整命令(如:java-xx:maxram=1024m-jardemo.jar),以内存调整命令启动第一应用程序并将调整值传递给第一应用程序,第一应用程序将调整值加载。

为了便于理解,下面以另一个实施例对本发明的一种启动应用程序的方法进行具体描述,请参阅图2,其应用程序为java程序,其包括:

s201.创建一个应用容器

在创建一个应用容器,该应用容器用于供java程序在其中进行运行;

s202.设定应用容器中的内存值

对所述应用容器中的内存值进行设定;应用容器中的内存配额代表着应用容器的最大内存容量;在初次创建一个应用容器后,可对应用容器中的内存配额进行设置,对于已设定有内存配额的应用容器,则可以对其应用容器中的内存配额进行修改;其中,应用容器中所设定的内存配额可以为一固定值,如1024m、2048m、4096m等,本实施例将内存配额设定为1024m为例进行说明;

而在其他实施例中,也可以不对应用容器中的内存值进行设置;若不对应用容器中的内存配额进行设置,则应用容器中的内存默认为无限制。

s203.对应用容器进行初始化

在所述应用容器创建完成后,对所述应用容器在文件系统、资源限制等环境进行初始化。

s204.检测java程序的运行环境参数

检测java程序的运行环境参数;由于当前应用容器一般使用cgroup配置文件来限制应用容器内存,所以在本实施例中可以通过读取cgroup配置文件来判断java程序是否位于最大内存被限制的应用容器内。

s205.判断java程序是否置入应用容器内

通过所述运行环境参数判断所述java程序置入应用容器内,其具体为:在所述运行环境参数中查找配置文件,若查找到所述配置文件,则java程序会置入应用容器内;若查找不到所述配置文件,则java程序没有置入应用容器内。比如对cgroup配置文件进行读取,如果该文件存在则代表java程序置入于应用容器内;如果该文件不存在,则代表java程序没有置入于应用容器内;若java程序置入于应用容器内,则进行步骤s206.获取内存配额和内存容量;若java程序没有置入于应用容器内,则进行步骤s211.直接启动所述应用程序;

s206.获取内存配额和内存容量

在应用程序置入到应用容器内的情况下,分别获取所述应用容器的内存配额和宿主机的内存容量;其中,宿主机的内存容量为宿主机的物理内存量;

s207.判断内存配额是否为限定值

根据所获取到应用容器的内存配额中的数值,判断该内存配额是否为限定值;其具体为:读取cgroup配置文件中的数值,若该数值为限定值1024m,则代表java程序位于内存配额为1024m的应用容器内,则进行步骤s208.获取调整值;若该数值为非限定值,则代表java程序位于最大内存没有被限制的应用容器内,则进行步骤s211.直接启动所述应用程序;

s208.确定调整值

比较所述内存配额与所述内存容量之间的大小,并以两者中较小的值作为调整值;例如:将宿主机的内存容量4096m和容器的内存配额1024m进行比较,将两个值中的较小值1024m作为调整值;

s209.生成内存调整命令

根据所述调整值生成内存调整命令,所述内存调整命令用于将所述应用程序的内存限制值调整为与所述调整值的大小相一致;即生成将应用程序的内存限制值调整为1024m的命令;

s210.在启动时加载内存调整命令

在启动所述应用程序的同时对所述内存调整命令进行加载,即在启动应用程序的同时,执行将应用程序的内存限制值调整为1024m的命令。

s211.直接启动java程序

java程序在启动时,会自动获取宿主机内存4096m作为java程序的内存限制值。

在步骤s209或s210对java程序启动后,如果用户需要对应用容器中的内存值进行修改,则进行步骤s202.设定应用容器中的内存值;用户可根据实际的使用情况将内存配额进行修改,重新设定为2048m或其他数值;在对应用容器中的内存值完成修改后,系统会自动按顺序进行剩余的步骤。

下面以一个实施例对本发明一种启动应用程序的装置进行描述,请参看图3,其应用程序为java程序,该java程序与启动应用程序的装置均设置于java虚拟机中,该java虚拟机是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的;

本发明的装置包括:

容器内存获取模块301,所述容器内存获取模块301用于获取供所述应用程序运行的应用容器的内存配额,应用容器中的内存配额代表着应用容器内可供应用程序使用的最大内存量;

主机内存获取模块302,所述主机内存获取模块302用于获取宿主机的内存容量,宿主机的内存容量即为宿主机的物理内存值;

调整值获取模块303,所述调整值获取模块303分别与所述容器内存获取模块301和所述主机内存获取模块302相连接,用于比较所述内存配额与所述内存容量之间的大小,并以两者中较小的值作为调整值;

调整命令生成模块304,所述调整命令生成模块304与所述调整值获取模块303相连接,用于根据所述调整值生成内存调整命令,所述内存调整命令用于将所述应用程序的内存限制值调整为与所述调整值的大小相一致;

调整命令加载模块305,所述调整命令加载模块305与所述调整命令生成模块304相连接,用于在应用程序启动模块306中加载上所述内存调整命令;

应用程序启动模块306,所述应用程序启动模块306与所述调整命令加载模块305相连接,用于对所述应用程序进行启动。

请参看图4,在本发明中,所述装置还包括:

容器创建模块307,所述容器创建模块307用于对应用容器进行创建;

容器内存设定模块308,所述容器内存设定模块308与所述容器创建模块307和环境参数检测模块309相连接,用于对所述应用容器的内存配额进行设定,并在设定完成后驱动环境参数检测模块309;

环境参数检测模块309,所述环境参数检测模块309用于检测java程序的运行环境参数;该运行环境参数包括:文件系统、资源限制等环境;

运行环境判断模块310,所述运行环境判断模块310与所述环境参数检测模块309相连接,用于根据检测到的运行环境参数判断所述应用程序是否置入到应用容器内,若应用程序是否置入到应用容器内,则驱动容器内存获取模块301和主机内存获取模块302;

请参看图5,在本发明中,所述运行环境判断模块310包括:

配置文件查找单元311,所述配置文件查找单元311用于在所述运行环境参数中对配置文件进行查找;由于当前应用容器一般使用cgroup配置文件来限制应用容器的内存配额,所以在本实施例中可以通过查找cgroup配置文件来判断java程序是否位于最大内存被限制的应用容器内;

运行判断单元312,所述运行判断单元312与所述配置文件查找单元311相连接,用于根据配置文件的查找结果,对java程序是否会在应用容器内运行进行判断;若查找到所述配置文件,则java程序置入到应用容器内;若查找不到所述配置文件,则java程序没有置入到应用容器内。

在本说明书的描述中,参考术语“一个实施方式”、“一些实施方式”、“示意性实施方式”、“示例”、“具体示例”、或“一些示例”等的描述意指结合实施方式或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施方式或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施方式或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施方式或示例中以合适的方式结合。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1