虚拟机内存的管理方法和管理系统与流程

文档序号:13743290阅读:102来源:国知局
技术领域本发明涉及计算机领域,具体地,涉及一种虚拟机内存的管理方法和管理系统。

背景技术:
JAVA大量作用于分布式系统,同时JAVA虚拟机是JAVA程序的绝对核心和基础。对JAVA虚拟机的实时监控是控制JAVA系统稳定的重中之重。其中内存管理,是很重要的一部分。由于业务不断发展,业务代码不断更新。稍不注意,经常会出现内存溢出的情况。解决的方式是通过JDK(JavaDevelopmentKit,JAVA语言的开发包)自带的工具jmap或者jconsle分析内存。该分析方式有以下缺点:第一、观察的只是某个具体时间点的状态,没有历史状态,对时间点的把控依赖人为操作;第二、对内存信息没有一个持久化的功能,基本没法进行后期内存信息比较、风险预警、类加载详情、空间分配的详情进行比较;第三、需要远程连接,开放机器指定端口,性能和安全都有风险;第四、只能作为工具使用,不容易被业务系统集成。以上缺点导致通过JDK工具定位问题需要很长的时间,缺少虚拟机内存监控同时增加了系统崩溃的风险。

技术实现要素:
有鉴于此,本发明提供一种应用于程序的内存管理方法和内存管理系统,以解决上述问题。根据本发明的第一方面,提供一种虚拟机内存的管理方法,包括:操作虚拟机解释和执行业务系统;在虚拟机运行期间,将所述虚拟机的内存快照存储到数据仓库;从所述内存快照中解析所述业务系统的状态数据;以及将所述状态数据存储到所述数据仓库。优选地,还包括:在所述虚拟机的内存快照存储到数据仓库之前,从配置服务器读取配置信息。优选地,所述虚拟机包括JAVA虚拟机,所述业务系统包括预编译为字节码的JAVA程序。优选地,所述配置信息包括快照采集的包目录和/或类名,所述包目录和/或类名用于限定所述虚拟机的内存快照。优选地,通过JAVA虚拟机的DUMP命令获取所述将虚拟机的内存快照。优选地,还包括:从所述业务系统中接收执行指令,根据所述执行指令触发所述将所述虚拟机的内存快照存储到数据仓库的步骤。优选地,还包括:获取所述虚拟机的堆内存的使用情况,根据所述堆内存的使用情况触发所述将所述虚拟机的内存快照存储到数据仓库的步骤。优选地,所述状态数据包括类和实例的描述数据,所述状态数据用于定位问题。根据本发明的第二方面,提供一种虚拟机内存的管理系统,包括:虚拟机节点,所述虚拟机节点包括虚拟机、业务系统和组件客户端,所述虚拟机解释和执行所述业务系统和所述组件客户端,在所述虚拟机运行期间,所述组件客户端将所述虚拟机的内存快照存储到数据仓库;快照分析节点,用于从所述内存快照中解析所述业务系统的状态数据;存储节点,用于将所述状态数据存储到所述数据仓库。优选地,还包括:配置服务器,用于提供所述虚拟机监视系统的配置信息。优选地,所述配置信息包括快照采集的包目录和/或类名,所述包目录和/或类名用于限定所述虚拟机的内存快照。优选地,所述虚拟机包括JAVA虚拟机,所述业务系统包括预编译为字节码的JAVA程序。优选地,所述组件客户端由所述业务系统进行触发。优选地,所述组件客户端监视虚拟机的堆内存的使用情况,根据使用情况进行触发。优选地,所述状态数据包括类和实例的描述数据,所述状态数据用于定位问题。本发明实施例提供的虚拟机内存的管理方法,包括:操作虚拟机解释和执行业务系统;在虚拟机运行期间,将所述虚拟机的内存快照存储到数据仓库;从所述内存快照中解析所述业务系统的状态数据;以及将所述状态数据存储到所述数据仓库。通过将内存快照和状态数据进行永久化存储,满足研发人员在定位问题时需要查看虚拟机内存的历史数据的需求。尤其在业务系统已经投入运营的情况下,本发明实施例提供的方案能够帮助运营人员监控虚拟机的内存,出现问题时,帮助研发人员迅速定位和解决问题。同时提供对应的管理系统。附图说明通过参照以下附图对本发明实施例的描述,本发明的上述以及其它目的、特征和优点将更为清楚,在附图中:图1是根据本发明实施例的虚拟机内存的管理方法的示意性框图;图2是根据本发明另一实施例的虚拟机内存的管理系统的结构图;图3是根据本发明实施例的将JAVA虚拟机的内存快照存储到数据仓库的流程图;图4是根据本发明实施例的管理系统中查看内存快照数据的流程图;图5是根据本发明实施例的将内存快照解析为状态数据的流程图。具体实施方式以下基于实施例对本发明进行描述,但是本发明并不仅仅限于这些实施例。在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。为了避免混淆本发明的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。附图中的流程图、框图图示了本发明实施例的系统、方法、装置的可能的体系框架、功能和操作,流程图和框图上的方框可以代表一个模块、程序段或仅仅是一段代码,所述模块、程序段和代码都是用来实现规定逻辑功能的可执行指令。也应当注意,所述实现规定逻辑功能的可执行指令可以重新组合,从而生成新的模块和程序段。因此附图的方框以及方框顺序只是用来更好的图示实施例的过程和步骤,而不应以此作为对发明本身的限制。本发明实施例中的术语:虚拟机是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。图1是根据本发明实施例的虚拟机内存的管理方法的示意性框图。在本方法中涉及的部件包括业务系统101、虚拟机100和数据仓库102,包括的操作有动作130、140和150,涉及的数据有内存快照110和状态数据120。动作150将多个业务系统101导入到虚拟机中解释并执行。虚拟机100将中间解释语言(例如,字节码)转换为机器执行语言。在一个实施例中,虚拟机100为JAVA虚拟机,业务系统为预编译为字节码的JAVA程序。虽然本发明的实施例是利用面向对象的JAVA语言来描述的,但本发明所描述的技术方案,也可以等效地应用于其他的编程语言,以及用于解释和执行这些语言的虚拟机。在虚拟机执行期间,动作130拍摄虚拟机的内存快照,并将这些内存快照存储到数据仓库102中。虚拟机的内存快照为一段二进制的字节码。调用虚拟机的API获取某个时刻的虚拟机的内存。在和JAVA虚拟机对应的实施例中,通过DUMP命令获取虚拟机的内存快照。动作140从数据仓库102中读取内存快照,并将内存快照进行解析,生成能够直接读取的状态数据,存储到数据仓库中。本领域的技术人员能够理解,虽然在此以数据仓库统称数据的存储软件,但在不同的实施例中,根据实际需要选择关系型数据库、文件库或操作系统等进行数据存储。本发明实施例将虚拟机内存数据持久化存储,方便研发人员定期或不定期的查看虚拟机内存的历史状态,尤其在业务系统出现故障时,通过查看状态数据的变化,定位问题,解决故障。图2是根据本发明另一实施例的虚拟机内存的管理系统的结构图。所述管理系统包括虚拟机节点201、存储节点202和快照分析节点203。所述节点包括耦合集群或独立服务器。虚拟机节点201包括业务系统和组件客户端,并在节点201上安装虚拟机。组件客户端指和虚拟机及业务系统部署在同一台机器上的功能模块,该功能模块用于拍摄虚拟机的内存快照,并把内存快照提交给数据仓库进行存储。该功能模块可以是基于代码耦合的部署,将实现该功能模块的代码嵌入到业务系统中,这时组件客户端由业务系统控制执行,也可以是在同一台机器上的独立部署,这时该独立模块通过监控虚拟机的当前状态决定是否启动组件客户端。例如,在虚拟机的堆内存的使用率超过预定阈值时,启动组件客户端。面向对象的业务系统一般包括类和实例。在虚拟机解释和执行业务系统时,每创建一个实例,需要在堆内存上为实例分配空间。随着实例的增加,用于新的实例的堆内存空间逐渐减少,由此增加了虚拟机崩溃的风险。因此,当堆内存的使用进入到警戒区域时,启动组件客户端,实现内存快照的记录,保存临界点的内存数据,方便研发人员进行堆数据监控和事后审查。在业务系统虚拟机中运行时,组件客户端实时从虚拟机里提取内存快照的二进制文件,然后压缩存入内存快照的数据仓库。在使用JAVA虚拟机进行解释和执行程序时,使用DUMP命令导出内存快照。由于DUMP内存快照的时候,整个虚拟机环境中的应用会暂停。所以在准备DUMP前会判定当前系统配置的DUMP的包目录。当配置了包目录和/或类名,DUMP内存快照信息中除了JDK平台的基础类信息,只会加载该目录下的类和/或指定类,以及相关的递归的类信息。这样可以提高DUMP的效率。当没有配置的时候,会生成整个虚拟机环境下所有类的信息(但是不推荐如此)。由于过于频繁的DUMP会对系统的正常运行产生影响。所以支持配置最高的一个DUMP频率(调用次数/小时)。当前的调用频率过大的时候,组件会选择性的不支持,尽量不影响业务系统的执行。通过配置内存快照的采集方式,避免内存快照采集影响到业务系统的运行。在一个可选的实施例中,上述管理系统还包括一个配置服务器204,在配置服务器204上存储有每个组件客户端启动时所需的初始化参数,例如,快照采集配置、数据仓库的IP、端口,快照采集配置包括限定数据快照范围的包目录和/或类名等。如前所述,通过限定内存快照的数据,防止记录内存快照的时间过长和数据过大,影响业务系统的正常运行。内存快照的文件名称可以标记为[系统id+ip+DUMP配置Id+时间戳]。另外,集中的配置管理有利于运营人员对配置信息进行维护。在一个可选的实施例中,配置服务器上部署ZooKeeper软件,ZooKeeper负责集中管理配置信息,其是一个分布式的,开放源码的分布式应用程序协调服务,提供的功能包括配置维护、名字服务、分布式同步、组服务等。通过终端205的登陆界面可以配置ZooKeeper软件上需要的配置参数。然后配置会实时同步到业务系统和组件客户端中。存储节点202从虚拟机节点201接收内存快照,并存储到数据仓库中。快照分析节点203从存储节点202中读取内存快照,从中解析出内存状态数据,并将状态数据存储到数据仓库中。在一个实施例中,内存快照解析的触发条件是当数据仓库中推入新的快照文件后,就会启动文件解析,将二进制文件解析为JAVA对象,然后序列化后存入数据仓库中。图3是根据本发明实施例的将JAVA虚拟机的内存快照存储到数据仓库的流程图。在步骤301中,采集服务初始化。在步骤302中,获取当前业务系统配置。在步骤303中,解析配置。在步骤304中,初始化采集触发worker。本文中的worker可以理解为自定义的任务执行代码块,可设定通过定时器定时执行,负责将暂存在虚拟机节点上的内存快照传输到数据仓库。在步骤305中,准备DUMP内存快照。在JAVA虚拟机中使用DUMP命令生成内存快照。在步骤306中,DUMP内存快照成二进制文件。在步骤307中,读取数据仓库信息。组件客户端提交读取数据仓库配置的请求。在步骤308中,读取数据仓库配置节点。配置服务器接收到读取请求,读取配置并传输给虚拟机节点。在步骤309中,解析配置。虚拟机节点对配置信息进行解析,获取数据仓库的IP和端口。在步骤310中,压缩文件,准备写入。将内存快照压缩后由worker传输到数据仓库。数据仓库在存储时,可以将内存快照分成若干个小文件存储,不影响存储效果。在步骤311中,写入文件到数据仓库。数据仓库存储内存快照。在步骤312中,执行DUMP内存快照完成。回到步骤304重复执行。图4是根据本发明实施例的管理系统中的查看内存快照数据的流程图。包括步骤401-步骤416。在步骤401中,调用查看API。业务系统内嵌入组件客户端的API,如果满足条件,则该执行该API。在步骤402中,调用快照分析API。根据上一个步骤传进来的参数,调用快照分析API。在步骤403中,解析请求。快照分析节点从参数中解析要求查看的内存快照时间范围及对应的业务系统,即时间戳+系统Id。在步骤404中,通过时间戳+系统Id查找。在步骤405中,得到内存快照信息集合。在步骤406中,遍历内存快照集合。在步骤407中,判断是否有下一个。在本步骤中,如果是,执行步骤408,否则执行步骤415。在步骤408中,取出下一个内存快照信息。在步骤409中,将内存快照信息转换为JAVA对象。在步骤410中,根据类名称查找类对象。从对应的JAVA对象中检索某个类对象。在步骤411中,生成类描述信息。类描述信息包括类名、父类、类加载器、子类、字段成员、实例数量和实例总空间。从JAVA对象中获得上述信息。在步骤412中,遍历所有实例,生成实例描述信息。遍历该类创建的所有实例,生成每个实例的描述信息。实例信息包括实例id、字段信息、锁信息、上下文类加载器、父类的字段信息、集成的权限上下文信息。由于字段可能也不是简单数据类型,本身可能也是对象。如果类包括若干子类,默认不递归生成所有子类的信息。可以通过子类的名称检索获取子类信息。或通过参数设置要求快照分析服务递归生成所有子类。在步骤413中,存储类和实例的描述信息。在步骤414中,封装最终描述信息在步骤415中,封装返回对象。在步骤416中,返回结果。最终,研发人员可以通过业务系统的UI界面查看类和实例的数据,以定位问题,解决故障。图4所示的快照分析过程根据业务系统的API请求发起,进行快照分析后将状态数据提供给业务系统的UI界面,并同时将状态数据存储到数据仓库。在另一个可选的实施方式中,对快照分析的过程可以在存储节点上定期执行。通过一个定时器程序定时将内存快照解析成状态数据,并保存到数据仓库中。这时,一旦业务系统提交查看状态数据的请求,即可以从数据仓库中直接读取状态数据用于显示,另外,研发人员也可以通过数据仓库的UI界面读取状态数据,以进行问题定位。图5是根据将内存快照解析为状态数据的流程图。如图5所示,解析一个二进制的内存快照文件包括步骤501-步骤505。在步骤501中,读入二进制的内存快照文件。在步骤502中,读取校验、版本信信息。顺序读取二进制文件的若干字节,从该字节中获取JDK、JAVA虚拟机的版本信息和校验位。在步骤503中,读取下四个字节,作为类型编码。接着读取四个字节,作为类型编码。该类型码包括常量类型,类加载器类型、栈侦类型、栈类型和堆内存类型,用于指示其后的若干字节保存的信息类型。在步骤504中,根据类型确定是否解析对应的信息。如果否,执行步骤505,否则执行步骤506。在步骤505中,跳过对应长度的字节位。在获取类型编码后,会根据配置文件判定当前类型是否需要解析,如果不需要解析,则直接跳过本次类型数据长度字节。避免无用数据解析,影响cpu计算效率。在步骤506中,获取该类型编码对应的信息的字节长度。在步骤507中,根据类型编码和字节长度进行解析。从二进制文件中获取对应长度的字节,并根据类型编码进行解析。这个步骤相对比较复杂,因为对栈侦类型、栈类型和堆内存类型的信息需要进行多次判断和多次解析,才能获取类、类对应的实例的描述信息。但由于本步骤的实现细节为本领域的公知常识,所以这里只概括,未进行详细说明。在步骤508中,将解析出的数据封装,并存储到数据仓库。在上述图2的实施例中,描述了一种虚拟机内存的管理系统,图3、图4和图5的实施例分别描述了内存快照存储、内存快照查看和内存快照解析的具体步骤。在一个优选的实施例中,组件客户端由业务系统进行触发。在一个优选的实施例中,组件客户端监视虚拟机的堆内存的使用情况,根据使用情况进行触发。在一个优选的实施例中,管理系统还包括:所述业务系统获取所述状态数据用于显示。在一个优选的实施例中,所述状态数据包括类和实例的描述数据,所述状态数据用于定位问题。从上述描述中可知,本发明实施例提供的虚拟机内存的管理系统具有多条优点。第一,彻底避免人为通过JDK工具来观察虚拟机内存情况,而是可以通过一定的规则来自动处理,实现内存快照信息自动采集。第二,通过将采集的内存数据自动持久化到数据仓库中,实现可监控海量机器,不同时段的虚拟机内存信息。为内存分析提供了数据基础。第三,组件客户端以API形式存在,业务系统调用组件客户端API可获取指定类信息(包括类的实例信息)。这样业务系统可以通过返回的细粒度类信息来实时做监控或者其他未知业务。系统的各个模块或单元可以通过硬件、固件或软件实现。软件例如包括采用JAVA、C/C++/C#、SQL等各种编程语言形成的编码程序。虽然在方法以及方法图例中给出本发明实施例的步骤以及步骤的顺序,但是所述步骤实现规定的逻辑功能的可执行指令可以重新组合,从而生成新的步骤。所述步骤的顺序也不应该仅仅局限于所述方法以及方法图例中的步骤顺序,可以根据功能的需要随时进行调整。例如将其中的某些步骤并行或按照相反顺序执行。根据本发明的系统和方法可以部署在单个或多个服务器上。例如,可以将不同的模块分别部署在不同的服务器上,形成专用服务器。或者,可以在多个服务器上分布式部署相同的功能单元、模块或系统,以减轻负载压力。所述服务器包括但不限于在同一个局域网以及通过Internet连接的多个PC机、PC服务器、刀片机、超级计算机等。以上所述仅为本发明的优选实施例,并不用于限制本发明,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1