内存监控方法、装置、终端和存储介质与流程

文档序号:17475346发布日期:2019-04-20 06:05阅读:237来源:国知局
内存监控方法、装置、终端和存储介质与流程

本发明实施例涉及通信技术领域,尤其涉及一种内存监控方法、装置、终端和存储介质。



背景技术:

内存管理在智能终端系统的设计中是极其重要的,高效的内存分配、释放和整理在应用中己越来越重要。智能终端系统开发阶段有许多内存监控的工具,例如:xcodememorygraph,insturmentallocation,vmtracker,vmmap,leak等系统自带工具。然而,上述内存监控工具只限于开发者调试使用。

在智能终端使用过程中,经常出现由于一些误操作导致的内存异常问题,严重时将导致智能终端死机,因此,通过内存监控手段来辅助检查应用程序(application,app)运行期间的内存使用状态显得尤为重要。现有技术中的内存监控方法虽然可以监控内存区域存活对象的地址、大小、堆栈信息,内存使用超过设定阈值时也可以导出并上传至服务器。然而,现有的内存监控方法中记录的内存信息无法持久保存,app退出后无法保存之前app运行时的内存信息,且占用了移动终端的物理内存资源。



技术实现要素:

有鉴于此,本发明提供一种内存监控方法、装置、终端和存储介质,解决了现有技术中内存信息无法持久保存,且占用了移动终端的物理内存资源的问题。

第一方面,本发明实施例提供了一种内存监控方法,包括:

获取应用程序运行时的内存信息;

将所述内存信息映射到磁盘文件中;

所述应用程序内存异常时,发送对应的映射内存信息,所述映射内存信息用于确定所述应用程序对内存中的异常位置。

进一步的,获取应用程序运行时的内存信息,包括:

通过钩子工具获取应用程序运行时的内存信息。

进一步的,所述将所述内存信息映射到磁盘文件中,包括:

采用内存映射方法将所述内存信息映射到磁盘文件中。

具体的,所述应用程序内存异常包括:

所述应用程序启动时的内存信息和所述应用程序退出时的内存信息不相同。

具体的,所述应用程序内存异常还包括:

应用程序启动时,检测到应用程序最后一次退出为异常退出。

具体的,所述异常退出包括:系统内存资源耗尽导致当前运行的应用程序被强制退出。

具体的,所述内存信息至少包括:内存地址、内存大小、内存堆栈和内存区域名称之一。

第二方面,本发明实施例还提供了一种内存监控装置,包括:

获取模块,用于获取应用程序运行时的内存信息;

映射模块,用于将所述内存信息映射到磁盘文件中;

发送模块,用于所述应用程序内存异常时,发送对应的映射内存信息,所述映射内存信息用于确定所述应用程序对内存中的异常位置。

具体的,所述获取模块,具体用于通过钩子工具获取应用程序运行时的内存信息。

具体的,所述映射模块,具体用于采用内存映射方法将所述内存信息映射到磁盘文件中。

进一步的,所述应用程序内存异常包括:

所述应用程序启动时的内存信息和所述应用程序退出时的内存信息不相同。

进一步的,所述应用程序内存异常还包括:

应用程序启动时,检测到应用程序最后一次退出为异常退出。

进一步的,所述异常退出包括:系统内存资源耗尽导致当前运行的应用程序被强制退出。

具体的,所述内存信息至少包括:内存地址、内存大小、内存堆栈和内存区域名称之一。

第三方面,本发明实施例还提供了一种终端,所述终端包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面中所述的内存监控方法。

第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理装置执行时实现如第一方面所述的内存监控方法。

上述实施例中提供的内存监控方法、装置、终端和存储介质,首先需要获取应用程序运行时的内存信息;然后将内存信息映射到磁盘文件中;当应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定所述应用程序对内存中的异常位置。即本实施例中通过内存映射的方式将内存信息映射到磁盘文件中,释放了终端的内存,从而解决了现有技术中内存信息无法持久保存,且占用了移动终端的物理内存资源的问题。使得内存信息可以长久的保存,且不占用内存资源,使用方便。

附图说明

图1是本发明实施例一中的内存监控方法的流程图;

图2是本发明实施例二中的内存监控方法的流程图;

图3是本发明实施例二中的内存映射的结构示意图;

图4是本发明实施例二中的内存变化曲线的示意图;

图5是本发明实施例三中的音频处理装置的结构示意图;

图6是本发明实施例四中的一种终端的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

实施例一

图1是本发明实施例一中的内存监控方法的流程图。本实施例可适用于监控内存使用状况的情况,本实施例提供的内存监控方法可以由内存监控装置执行,该内存监控装置可以通过软件和/或硬件的方式实现。设定内存监控的装置集成在终端中,即内存监控的方法由终端来执行。上述终端是指具有向计算机输入程序和数据或接收计算机输出处理结果功能的设备。上述终端包括但不限于笔记本电脑、智能手机、平板电脑、便携式媒体播放器、导航装置、可穿戴设备、智能手环和计步器等移动终端以及数字tv、台式计算机等固定终端。

具体的,如图1所示,本发明实施例提供的内存监控的方法,主要包括如下步骤:

s110、获取应用程序运行时的内存信息。

需要说明的是,内存是与终端中的中央处理器(centralprocessingunit,cpu)进行沟通的桥梁。终端中所有程序的运行都是在内存中进行的,因此内存的性能对终端的影响非常大。内存主要是用于暂时存放cpu中的运算数据,以及与硬盘等外部存储器交换的数据。只要终端在运行中,cpu就会把需要运算的数据调到内存中进行运算,当运算完成后cpu再将结果传送出来,内存的使用状态也决定了计算机的稳定运行。进一步的,内存信息是指反应内存运行状态的数据信息,例如:内存信息至少包括:内存地址、内存大小、内存堆栈和内存区域名称之一或者至少两者的组合。

在本实施例中,获取应用程序运行时的内存信息是指在应用程序中注入钩子工具,钩子工具为hook工具,通过hook工具记录应用程序运行时的内存信息。hook是指监听函数调用的行为。优选的,注入hook工具的过程为动态注入过程,并没有改变应用程序的源代码。终端只需要在应用程序中注入hook工具即可对应用程序的内存占用情况进行记录,这样,终端无需获取应用程序的源代码就可以实现对系统内存空间的实时记录。

需要说明的是,通过hook工具可以捕捉进程或其他进程发生的事件。在本发明实施例中hook工具实现记录功能,用于记录应用程序在运行过程中占用终端内存的情况。

需要说明的是,本实施例中仅仅对获取应用程序运行时的内存信息的方式进行说明,而非限定,可以根据需要设计其他获取内存信息的方式。

s120、将内存信息映射到磁盘文件中。

在本实施例中,磁盘文件是终端里的文件,在磁盘文件中存储的信息不受断电的影响,并且磁盘的容量大,可以存储大量的信息。

在本实施例中,在将内存信息映射到磁盘文件中之前,需要获取内存和磁盘文件的映射关系。若hook工具记录了应用程序运行时的内存信息,则获取内存和磁盘文件的映射关系,根据映射关系和内存信息,生成相应的映射内存信息,将映射内存信息在磁盘文件中进行存储。这样使得即使应用程序异常退出,也能够重新获取上一次应用程序运行时的内存状态。

进一步的,采用mmap的方式将内存信息映射到磁盘文件中,即内存和磁盘文件的映射关系生成的映射内存信息为mmap数据结构。mmap的方式是将内存信息被映射到多个页上,如果内存信息的大小不是所有页的大小之和,最后一个页中没有被使用的空间将会清零。

s130、应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定应用程序对内存中的异常位置。

在本实施例中,应用程序内存异常是指应用程序在运行过程中,终端内存出现异常状态,示例性的,内存异常包括:内存泄露、占用内存大小异常增长等。进一步的,当应用程序启动时,检测到上次应用程序非正常退出,则将上次应用程序运行时的对应的映射内存信息进行发送。或者,在对应用程序的内存状态进行检测时,检测到应用程序在测试前后存在内存增长的情况,则将内存增长的情况进行发送。对于应用程序内存异常的检测方法,本实施例中不做限定,可以根据需要设计合适的内存异常检测方式。

若检测到应用程序内存异常,则将对应时间段内的映射内存信息进行发送。在本实施例中,可以将映射内存信息发送至服务器,由服务器来分析内存异常的原因,定位发生内存异常的位置,使得开发人员可以对应用程序进行更新和修正。此外,也可以将映射内存信息发送至开发人员的终端,由开发人员分析内存异常的原因,定位发生内存异常的位置。

本实施例中提供的内存监控方法,首先需要获取应用程序运行时的内存信息;然后将内存信息映射到磁盘文件中;当应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定所述应用程序对内存中的异常位置。即本实施例中通过内存映射的方式将内存信息映射到磁盘文件中,释放了终端的内存,从而解决了现有技术中内存信息无法持久保存,且占用了移动终端的物理内存资源的问题,使得内存信息可以长久的保存,且不占用内存资源,使用方便。

实施例二

图2是本发明实施例二中的内存监控方法的流程图;本实施例进一步优化了内存监控方法,如图2所示,优化后的内存监控方法,主要包括如下步骤:

s210、通过钩子工具获取应用程序运行时的内存信息。

在本实施例中,钩子工具为hook工具,通过hook工具可以捕捉进程或其他进程发生的事件。在本发明实施例中hook工具实现记录功能,用于记录应用程序在运行过程中终端的内存情况。

在本实施例中,在内存进行分配和释放操作时,记录内存信息。进一步的,针对内存的操作,主要包括:malloc函数、calloc函数、realloc函数、free或delete函数和new函数等。下面对内存的函数进行简单介绍。

malloc函数,即memoryallocation,是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。若内存分配成功,则返回指向被分配内存的指针,否则返回空指针。malloc函数只有一个参数,即要分配的内存空间的大小。例如:void*malloc(size_tsize)。malloc返回的内存块地址都是8的倍数,若是64位系统,则为16的倍数。

calloc函数也是动态内存分配函数,用于在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回空指针。calloc函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。例如:void*calloc(size_tn,size_tsize)。

realloc函数,即resetallocation,动态内存调整函数,realloc函数主要用于先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。否则返回空指针。

free或delete函数,是动态内存释放函数,用于释放malloc函数、calloc函数、和realloc函数给指针变量分配的内存空间。使用后该指针变量一定要重新指向空指针,防止野指针出现,有效规避误操作。

new相当于一个函数,在内存开辟完空间后,返回这个空间的首地址。

对上述malloc函数、calloc函数、realloc函数、free或delete函数、和new函数进行hook,记录其分配或者释放的内存地址、内存大小以及内存堆栈等。

s220、采用内存映射方法将内存信息映射到磁盘文件中。

在本实施例中,内存映射是指将一个内存信息映射到一个文件,优选的,内存映射为共享内存,即进程a和进程b都将该页映射到自己的地址空间,当进程a第一次访问该页中的数据时,它生成一个缺页终端,内核此时读入这一页到内存并更新页表使之指向它,以后,当进程b访问同一页面而出现缺页中断时,该页已经在内存,内核只需要将进程b的页表登记项指向次页即可。

进一步的,本实施例中,采用mmap方式实现共享内存,mmap使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write等操作。

图3是本发明实施例二中的内存映射的结构示意图;如图3所示,在内存空间内由多个虚拟内存区域构成。虚拟内存区域是进程的内存空间中的一个同质区间,即具有同样特性的连续地址范围。如图3所示,代码数据段、初始数据段、bss数据段、堆、栈和内存映射,都是一个独立的虚拟内存区域。而为内存映射服务的地址空间处在堆栈之间的空余部分。

本实施例中,采用mmap方式实现内存映射,采用mmap方式主要有3个步骤,首先,进程启动映射过程,并在磁盘文件中为映射创建内存信息映射区域,即在磁盘空间中,寻找一段空闲的满足要求的连续的磁盘地址,为此地址分配一个_typedefstruct结构,接着对这个结构的各个区域进行了初始化,将新建的区域结构(typedef_struct)插入磁盘区域链表或树中。其次,调用函数mmap,实现文件物理地址和进程虚拟地址的一一映射关系,

即为映射分配了新的磁盘地址区域后,通过待映射的内存信息指针,在内存信息描述符表中找到对应的内存信息描述符,通过内存信息描述符,hook工具已经获取的内存信息,通过该内存信息的内存信息结构体,调用mmap函数,mmap函数定位到内存信息在内存中的虚拟地址,通过调用函数建立页表,即实现了内存地址和磁盘区域之间的映射关系。最后,进程发起对这片映射空间的访问,实现内存到磁盘的拷贝。即进程的读或写操作访问次磁盘空间这一段映射地址,通过查询页表,发现这一段地址并不在页面上。因为目前只建立了地址映射,真正的内存信息还没有拷贝到磁盘中,因此引发缺页异常。缺页异常进行一系列判断,确定无非法操作后,发起请求调页过程。则调用函数把所缺的页从主存装入到磁盘中。

在本实时例中,提供两种mmap数据结构的实现方案,一种是mmaptree结构,另外一种是mmaplist结构。下面对两种结构进行介绍。

示例性的,mmaptree结构:

typedefstruct{

bsmmapsplaytreenodeindexrootnode;//nodepositionfornodeindex=nodepage*pagesize+nodeindex*nodesize

bsmmapsplaytreenodeindexfreenode;//firstfreeblock

}bsmmapsplaytree;

通过上述编程可知,树中节点在内存中的实际位置可以通过index函数进行,index函数可以返回表或者区域中的值。进一步的,实际位置=节点位于的页的顺序×页的大小+节点返回值×节点大小。

进一步的,当前可用节点记录在freenode当中,并且可用节点会指向上一个可用节点形成chainlist,用于快速分配可用的节点来记录数据。

mmaplist结构:

typedefstruct{

bsmmaplistindexrootnode;//nodepositionfornodeindex=nodepage*pagesize+nodeindex*nodesize

bsmmaplistindexfreenode;//firstfreeblock

}bsmmaplist;

通过上述编程可知,列表中节点在内存中的实际位置可以通过index函数进行,index函数可以返回表或者区域中的值。进一步的,实际位置=节点位于的页的顺序×页的大小+节点返回值×节点大小。

进一步的,当前可用节点记录在freenode当中,并且可用节点会指向上一个可用节点形成chainlist,用于快速分配可用的节点来记录数据。

在本实施例中,提供了一种虚拟内存和磁盘文件的映射关系,根据映射关系确定映射存储结构,在本实施例中,映射存储结构采用上述两种mmap数据结构,可以选用其中的一种数据存储结构,也可以使两种数据存储结构配合使用。

s230、应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定应用程序对内存中的异常位置。

在本实施例中,应用程序内存异常包括:应用程序启动时的内存信息和应用程序退出时的内存信息不相同。

进一步的,在使用自动化测试脚本对应用程序进行检测时,对该应用程序启动时的内存信息及退出时的内存信息进行比较,根据比较结果确定应用程序内存异常。具体地,内存信息至少包括:内存地址、内存大小、内存堆栈和内存区域名称之一。

具体的,本实施例提供一个优选实例,可将应用程序启动时内存信息中的内存地址和退出时的内存信息中的内存地址进行比较,若应用程序退出时内存信息中比应用程序启动时内存信息中存在多余的内存地址,则说明应用程序内存异常,多余的内存地址为内存泄漏地址,可以根据内存泄漏地址计算内存泄漏大小。

具体的,本实施例提供另一个优选实例,可将应用程序启动时内存信息的内存堆栈和退出时的内存信息中的内存堆栈进行比较,若应用程序退出时内存信息中比应用程序启动时内存分配信息中存在多出的内存堆栈,则说明应用程序内存异常,多的函数堆栈为内存泄漏堆栈,可以根据内存泄漏堆栈计算内存泄漏大小。

进一步的,若检测到应用程序内存异常,则将对应时间段内的映射内存信息进行发送。可以将映射内存信息发送至服务器或者开发人员的终端,方便开放人员发现分析内存异常的原因,定位发生内存异常的位置。

本实施例中,提供一种定位发生内存异常的位置,具体的,对多的内存堆栈按照对应的函数地址大小进行排序,再对排序后的函数堆栈进行分类统计,得出函数堆栈内存泄漏次数和内存泄漏大小。具体地,将多的内存堆栈进行分类,统计同一类的函数堆栈的泄漏次数,并计算出所有内存堆栈的内存泄漏大小。

此外,还可以根据应用程序运行期间占用的内存大小来确定是否存在内存异常。进一步的,若应用程序运行期间占用的内存大小超过应用程序对应的正常范围,则确定该应用程序存在内存异常的状况。

具体的,针对当前测试的应用程序,预先绘制并记录在正常运行过程中的内存变换曲线,得出正常内存波动参考曲线。实时监控当前运行过程中内存变化曲线,并与正常内存波动参考曲线进行比较,判断当前运行过程中内存变化曲线是否超出正常内存波动参考曲线的波动趋势范围,若超出,则确定当前应用程序发生内存异常。图4是本发明实施例二中的内存变化曲线的示意图,由图4可以看出,应用程序运行过程中,其内存变化曲线在预设的范围内波动。若在当前运行过程中内存变化曲线超出内存变化曲线在预设的波动范围,则确定当前应用程序发生内存异常。

进一步的,应用程序内存异常还包括:应用程序启动时,检测到应用程序最后一次退出为异常退出。具体的,异常退出包括:系统内存资源耗尽导致当前运行的应用程序被强制退出。

具体的,当应用程序启动时,若检测到应用程序最后一次退出系统内存资源耗尽导致当前运行的应用程序被强制退出,则确定应用程序发生内存异常。将上次应用程序运行期间的内存信息发送至服务器或者开发人员终端。

进一步的,可以通过排除的方法检测应用程序最后一次退出是否为异常退出。具体的,当应用程序启动时,检测应用程序最后一次的退出方式,若应用程序不是正常的逻辑退出,例如:点击退出按钮或者触发预设的退出条件等。则确定应用程序最后一次退出为异常退出。

本实施例中提供的内存监控方法,首先需要通过钩子工具获取应用程序运行时的内存信息;然后采用内存映射方法将所述内存信息映射到磁盘文件中;当应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定所述应用程序对内存中的异常位置。即本实施例中通过内存映射的方式将内存信息映射到磁盘文件中,释放了终端的内存,从而解决了现有技术中内存信息无法持久保存,且占用了移动终端的物理内存资源的问题。使得内存信息可以长久的保存,且不占用内存资源,使用方便。

实施例三

图5是本发明实施例三中的内存监控装置的结构示意图,本实施例可适用于监控内存使用状况的情况,本实施例提供的内存监控装置可以通过软件和/或硬件的方式实现。设定内存监控的装置集成在终端中,该内存监控装置的具体结构如下:

获取模块410,用于获取应用程序运行时的内存信息。

映射模块420,用于将所述内存信息映射到磁盘文件中;

发送模块430,用于所述应用程序内存异常时,发送对应的映射内存信息,所述映射内存信息用于确定所述应用程序对内存中的异常位置。

本实施例中提供的内存监控装置,首先需要获取应用程序运行时的内存信息;然后将内存信息映射到磁盘文件中;当应用程序内存异常时,发送对应的映射内存信息,映射内存信息用于确定所述应用程序对内存中的异常位置。即本实施例中通过内存映射的方式将内存信息映射到磁盘文件中,释放了终端的内存,从而解决了现有技术中内存信息无法持久保存,且占用了移动终端的物理内存资源的问题。使得内存信息可以长久的保存,且不占用内存资源,使用方便。

具体的,获取模块410,具体用于通过钩子工具获取应用程序运行时的内存信息。

具体的,映射模块420,具体用于采用内存映射方法将所述内存信息映射到磁盘文件中。

进一步的,所述应用程序内存异常包括:

所述应用程序启动时的内存信息和所述应用程序退出时的内存信息不相同。

进一步的,所述应用程序内存异常还包括:

应用程序启动时,检测到应用程序最后一次退出为异常退出。

进一步的,所述异常退出包括:系统内存资源耗尽导致当前运行的应用程序被强制退出。

具体的,所述内存信息至少包括:内存地址、内存大小、内存堆栈和内存区域名称之一。

本发明实施例所提供的内存监控装置可执行本发明任意实施例所提供的内存监控方法,具备执行方法相应的功能模块和有益效果。

实施例四

图6是本发明实施例四中的一种终端的结构示意图,如图6所示,该终端包括处理器510、存储器520、输入装置530和输出装置540;终端中处理器510的数量可以是一个或多个,图6中以一个处理器510为例;终端中的处理器510、存储器520、输入装置530和输出装置540可以通过总线或其他方式连接,图6中以通过总线连接为例。

存储器520作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的内存监控方法对应的程序指令/模块(例如,内存监控装置中的获取模块410、映射模块420和发送模块430)。处理器510通过运行存储在存储器520中的软件程序、指令以及模块,从而执行终端的各种功能应用以及数据处理,即实现上述的内存监控方法。

存储器520可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器520可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器520可进一步包括相对于处理器510远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置530可用于接收输入的数字或字符信息,以及产生与终端的用户设置以及功能控制有关的键信号输入。输出装置540可包括显示屏等显示设备。

实施例四

本发明实施四还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理装置执行时实现内存监控方法,该方法包括:

获取应用程序运行时的内存信息;

将所述内存信息映射到磁盘文件中;

所述应用程序内存异常时,发送对应的映射内存信息,所述映射内存信息用于确定所述应用程序对内存中的异常位置。

当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的内存监控方法操作,还可以执行本发明任意实施例所提供的内存监控方法中的相关操作.

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的内存监控方法。

值得注意的是,上述内存监控装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

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