CN104778087B - 一种信息处理方法以及信息处理装置 - Google Patents
一种信息处理方法以及信息处理装置 Download PDFInfo
- Publication number
- CN104778087B CN104778087B CN201410009405.1A CN201410009405A CN104778087B CN 104778087 B CN104778087 B CN 104778087B CN 201410009405 A CN201410009405 A CN 201410009405A CN 104778087 B CN104778087 B CN 104778087B
- Authority
- CN
- China
- Prior art keywords
- operation object
- recorded
- needing
- storehouse
- middleware
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Storage Device Security (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种信息处理方法以及信息处理装置,所述信息处理方法包括:在中间件运行时,确定所述中间件的运行堆栈中需要被记录的运行对象;记录所述需要被记录的运行对象的运行时特征;根据所述运行时特征,确定所述需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
Description
技术领域
本发明涉及信息处理领域,尤其涉及一种信息处理方法以及信息处理装置。
背景技术
中间件(middleware)是一种独立的系统软件或服务程序,是处于操作系统、数据库和应用程序之间的软件,有时被视为操作系统或数据库的一部分,有时也被认为是应用程序的一部分,例如在业务运营支撑系统(Business&Operation Support System,BOSS)中,其处于操作系统、数据库和应用程序之间,主要承载了核心业务逻辑的运行。
随着社会的进一步发展,需求膨胀、业务浪涌导致硬件资源开销不断膨胀,JVM中间件承载的应用程序的性能问题也逐步凸现出来,诸如接口连接不及时释放、批量业务导致的大规模内存分配、第三方应用程序的缺陷甚至中间件本身的缺陷等引发了内存泄漏,给生产运营造成了很大的破坏性影响。这需要维护人员及时发现并反馈给研发修改,但周期长、效率低。
目前,为定位发生内存泄露的位置,以中间件为基于JVM(Java Virtual Machine,Java虚拟机)的中间件为例,通常通过对内存进行分析的方式来进行定位,例如转储JVM堆内存,按照内存空间消耗百分比进行对象排名,排名较靠前的对象判断为内存泄漏的中间产物,并在中间件环境中搜索和中间产物存在引用关系的程序,最终定位发生内存泄露的位置。
但在生产环境下,也即与中间件相连的系统以及应用处于运行状态时,现有的堆内存分析方式具有较大的侵入性,转储堆内存的方式会让Java进程处于假死状态,业务响应停滞;也可以启动Java进程的调试模式,使用外部代理程序对堆内存进行调试,窥探堆内存中内存对象的回收情况,这种方式在生产环境运行下调试有很大风险,如果被调试的内容处于关键路径上,会导致线程被阻塞,对外服务终止,同样会导致业务响应停滞。
因此,现有技术中存在通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题。
发明内容
本发明实施例通过提供一种信息处理方法以及电子设备,用以解决现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题。
本发明实施例提供了一种信息处理方法,包括:在中间件运行时,确定所述中间件的运行堆栈中需要被记录的运行对象;记录所述需要被记录的运行对象的运行时特征;根据所述运行时特征,确定所述需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
可选地,所述确定所述中间件的运行堆栈中需要被记录的运行对象,具体包括:通过所述运行堆栈的对象摘要列表,获得位于所述对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,所述对象摘要列表为按照占据所述运行堆栈的存储容量从大到小的方式对运行对象排序后的列表;对所述运行堆栈执行全量垃圾搜集处理,并确定所述M个运行对象中位于所述对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数;在所述N个运行对象在所述中间件的引用队列上的数量超过第一预设门限值时,确定所述N个运行对象为所述需要被记录的运行对象。
可选地,在所述获得位于所述对象摘要列表中前M位的M个运行对象之前,所述方法还包括:屏蔽所述对象摘要列表中的指定运行对象,以及屏蔽在所述引用队列上的数量小于第二预设门限值的运行对象,所述第二预设门限值小于所述第一预设门限值。
可选地,所述记录所述需要被记录的运行对象的运行时特征,具体为:记录所述需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号;所述根据所述运行时特征,确定所述运行堆栈内的发生内存泄露的运行对象对应的业务,具体为:基于所述第一线程堆栈信息和所述第二堆栈线程堆栈信息,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块;和/或基于所述建立套接字连接的目标地址和端口号,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块。
可选地,在所述记录所述需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号的同时,所述方法还包括:记录所述需要被记录的运行对象的实例化数量,并建立所述实例化数量与所述运行堆栈之间的对应关系。
本发明实施例另一方面还提供了一种信息处理装置,包括:第一确定单元,用于在中间件运行时,确定所述中间件的运行堆栈中需要被记录的运行对象;记录单元,用于记录所述需要被记录的运行对象的运行时特征;第二确定单元,用于根据所述运行时特征,确定所述需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
可选地,所述第一确定单元具体用于通过所述运行堆栈的对象摘要列表,获得位于所述对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,所述对象摘要列表为按照占据所述运行堆栈的存储容量从大到小的方式对运行对象排序后的列表,并对所述运行堆栈执行全量垃圾搜集处理,并确定所述M个运行对象中位于所述对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数,并在所述N个运行对象在所述中间件的引用队列上的数量超过第一预设门限值时,确定所述N个运行对象为所述需要被记录的运行对象。
可选地,所述装置还包括屏蔽单元,用于在所述获得位于所述对象摘要列表中前M位的M个运行对象之前,屏蔽所述对象摘要列表中的指定运行对象,以及屏蔽在所述引用队列上的数量小于第二预设门限值的运行对象,所述第二预设门限值小于所述第一预设门限值。
可选地,所述记录单元具体用于记录所述需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号;所述第二确定单元,具体用于基于所述第一线程堆栈信息和所述第二堆栈线程堆栈信息,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块;和/或基于所述建立套接字连接的目标地址和端口号,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块。
可选地,所述记录单元具体还用于记录所述需要被记录的运行对象的实例化数量,并建立所述实例化数量与所述运行堆栈之间的对应关系。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
1、由于采用了在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象,并记录需要被记录的运行对象的运行时特征,并根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的技术方案,不会直接访问中间件的运行堆栈中的运行对象,而是记录该运行对象的运行时特征,并根据该运行时特征,确定出发生内存泄露的运行对象对应的应用程序中的业务模块,对实际业务没有侵入性,所以解决了现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题,减小了对生产环境的侵入性,从而实现了在确定了发生内存泄露的运行对象对应的应用程序中的业务模块的同时,保证了生产环境正常运行的技术效果。
2、由于采用了通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,并对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,并在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象的技术方案,不需要通过人为经验判断来确定发生内存泄露的对象,所以避免了现有技术中需要丰富的人为经验判断才能够确定出有发生内存泄露的对象的缺陷,提高了需要被记录的运行对象的准确性,从而降低了系统记录需要被记录的运行对象的资源消耗。
附图说明
图1为本发明实施例提供的信息处理方法的流程图;
图2为根据本发明实施例提供的信息处理方法,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的示意图;
图3为本发明实施例提供的监听器的工作流程图;
图4为本发明实施例提供的监听器记录时的示意图;
图5为本发明实施例提供的建立需要被记录的运行对象的实例化数量与运行堆栈之间的对应关系的示意图;
图6A和图6B是本发明实施例对于多个运行对象处于不同的加载顺序层级的情况的部署示意图;
图7为本发明实施例提供的信息处理装置的功能模块图。
具体实施方式
本发明实施例通过提供一种信息处理方法以及电子设备,用以解决现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题。
本发明实施例中的技术方案为解决上述技术问题,总体思路如下:
本发明实施例提供一种信息处理方法,该方法包括:
在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象;
记录需要被记录的运行对象的运行时特征;
根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
通过上述部分可以看出,由于采用了在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象,并记录需要被记录的运行对象的运行时特征,并根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的技术方案,不会直接访问中间件的运行堆栈中的运行对象,而是记录该运行对象的运行时特征,并根据该运行时特征,确定出发生内存泄露的运行对象对应的应用程序中的业务模块,对实际业务没有侵入性,所以解决了现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题,减小了对生产环境的侵入性,从而实现了在确定了发生内存泄露的运行对象对应的应用程序中的业务模块的同时,保证了生产环境正常运行的技术效果。
为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。
本发明实施例提供一种信息处理方法,请参考图1,图1是本发明实施例提供的信息处理方法的流程图,如图1所示,该方法包括:
S1:在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象;
S2:记录需要被记录的运行对象的运行时特征;
S3:根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
在接下来的部分中,将以中间件为一基于JVM的中间件为例,来进行详细的举例说明。
在步骤S1中,请同时参考图1与图2,图2是根据本发明实施例提供的信息处理方法,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的示意图,如图2所示,确定中间件的运行堆栈中需要被记录的运行对象,具体来讲,可以包括:通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,对象摘要列表为按照占据运行堆栈的存储容量从大到小的方式对运行对象排序后的列表;对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数;在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象。
例如,第一步,通过中间件的运行堆栈的对象摘要列表,确定出占用内存排名前10位的10个运行对象,当然,在此对排名数量也即M的具体数值不做限制,M的数值也可以是5、15等等,通过本发明实施例的介绍,本发明所属的技术人员能够根据实际情况,设置M为合适的数值,以满足实际情况的需要,在此就不再赘述了。
第二步,对运行堆栈进行全量垃圾搜集(Full Garbage Collection),并再次根据中间件的运行堆栈的对象摘要列表,确定出在前一步骤中确定出的10个对象中仍然位于对象摘要列表中前10位的对象,此时确定出的对象可以是1个,也可以是多个,在此不做限制。
在实际应用中,由于全量垃圾搜集的不可控制性,所以此步骤可以反复执行以提高筛选效率,当然,通过本发明实施例的介绍,本领域所属的技术人员能够实际情况,确定需要反复执行的次数,以满足实际情况的需要,在此就不再赘述了。
第三步,扫描该运行堆栈的引用队列,若第二步骤中确定出的对象在引用队列上的数量超过了第一预设门限值,第一预设门限值例如可以是5个、10个等等,则说明这些对象的回收出现了问题,也即这些对象发生了内存泄露,从而能够确定出这些对象对应的应用程序的业务模块发生了内存泄露。当然了,引用队列中会包括一些间接引用对象,但间接引用对象对于判断内存是否发生泄露意义不大,所以可以对间接引用对象予以摈弃,在此就不再赘述了。
为了提高确定出的运行对象的准确率,在第一步之前,本发明实施例提供的信息处理方法还包括:屏蔽对象摘要列表中的指定运行对象,以及屏蔽在引用队列上的数量小于第二预设门限值的运行对象,第二预设门限值小于第一预设门限值。
具体来讲,可以是屏蔽中间件的运行堆栈中用户指定一些运行对象,例如中间件容器、Java开发工具包(Java Development Kit,JDK)等,以及屏蔽引用队列上的数量小于第二预设门限值的运行对象,例如在引用队列上的数量小于2个或者3个的运行对象,这些运行对象发生内存泄露的可能性较小,所以即使其占用运行堆栈的容量较大,也可以不将其确定为需要被记录的运行对象,当然,随着生产环境的持续运行,原来引用队列中数量的增加,一些运行对象会随着时间的增加被确定为需要被记录的运行对象,在此就不再赘述了。
通过上述部分可以看出,由于采用了通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,并对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,并在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象的技术方案,不需要通过人为经验判断来确定发生内存泄露的对象,所以避免了现有技术中需要丰富的人为经验判断才能够确定出有发生内存泄露的对象的缺陷,提高了需要被记录的运行对象的准确性,从而降低了系统记录需要被记录的运行对象的资源消耗。
在通过步骤S1确定出需要被记录的运行对象以后,本发明实施例提供的信息处理方法进入步骤S2,即:记录需要被记录的运行对象的运行时特征。
在步骤S2中,记录需要被记录的运行对象的运行时特征,具体来讲,可以是记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号。
在具体实施过程中,可以是通过中间件的监听器来记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号。
在实际应用中,中间件所在的服务器在启动、关闭时会读取配置文件中监听器的相关配置,并触发监听器的初始化、销毁事件,在本实施例中,请参考图3,图3是本发明实施例提供的监听器的工作流程图,如图3所示,为了实现监控器的自适应监控,还同时对监听器进行继承,使得监听器可以根据设定的时间,或者根据用户的操作触发监听器的初始化,并开始记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号,当然,也可以在中间件的业务高峰时段、或用户的操作触发监听器停止外部管理服务等等,在此就不再赘述了。
当然,在实际应用中,若需要被记录的运行对象可以被监听器截获初始化函数、终结函数,并被监听器捕获完整线程堆栈信息,则可以控制监听器正常工作,若需要被记录的运行对象无法被监听器截获初始化函数、终结函数以及被监听器捕获完整线程堆栈信息,则可以对该运行对应的应用程序进行二次开发或者逆向工程处理,从而使得监听能够记录下需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号,在此就不再赘述了。
在监听器记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号的时候,请参考图4,图4是本发明实施例提供的监听器记录时的示意图,如图4所示,监听器在需要被记录的运行对象初始化时(类似initialize、构造函数及其重构、页面控制组件action的execute方法等)触发指标收集,记录指标数据;在对象销毁方法执行时(类似finalize、doClose等显著终结标志的函数)触发指标回收。通过此处可以看出,在运行堆栈中未被回收的指标对应的运行对象即为发生内存泄露的运行对象,当然,此处未被回收的指标是指经过一定次数的全量垃圾搜集后仍然存在的指标,从而通过监听器记录下的这些运行对象的线程堆栈信息,继而可以定位到应用程序中发生内存泄露的业务模块。
上述监听器触发的指标程序来自于运行对象的源代码定制版本或逆向工程修改版本,需要被记录的运行对象在初始化方法和销毁方法中增加了全局监控对象的更新方法,本发明实施例定义了一个全局监控对象举例如下:
//被监控的SocksSocketImpl类
public static Map<String,StackTraceElement[]>g_trcSksSkt=new HashMap<String,StackTraceElement[]>();
public static Map<String,String>g_trcSksSktTm=new HashMap<String,String>();
public static Map<String,Map<String,String>>g_trcSksSktProps=newHashMap<String,Map<String,String>>();
其中,第一个哈希表为运行对象哈希值和堆栈信息的对应关系,第二个为哈希值和初始化时间的对应关系,二者通过哈希值关联,第三个为个性化属性列表,具有可扩展性,可以根据实际情况进行扩展,在此就不再赘述了。
在具体实施过程中,在监听器记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号的同时,本发明实施例提供的信息处理方法还包括:记录需要被记录的运行对象的实例化数量,并建立实例化数量与运行堆栈之间的对应关系。
具体来讲,在监听器记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号的时候,同时记录需要被记录的运行对象的实例化数量,以向用户提供应用程序的不同业务模块的内存消耗对比数据。
在保存监听器记录的需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号时生成的指标的时候,可以采用Key-Set结构,不同的指标单独使用不同的哈希列表存放,Key值如无特殊需求,可直接使用当前对象的哈希值,但这种情况在业务高峰时段会额外分配较多永久代内存,本发明实施例提供了对线程堆栈进行了再哈希运算的方法,请参考图5,图5是本发明实施例提供的建立需要被记录的运行对象的实例化数量与运行堆栈之间的对应关系的示意图,如图5所示,对于同一种类型,也即一种业务对应的运行堆栈计算出唯一的哈希值,并单独创建索引列表,对不同的索引再单独创建实例化对象数量统计表,二者使用哈希值关联,从而节省较多的内存空间,同时以较为直观的方式,向用户提供不同的业务的内存消耗对比数据。
通过上述部分可以看出,由于采用了对于同一类型的运行堆栈计算出哈希值,并单独创建索引列表,对不同的索引再单独创建实例化对象数量统计表,二者使用哈希值关联的技术方案,在业务高峰时段不会额外分配永久代内存,减少了对运行堆栈的消耗。
在通过步骤S2记录需要被记录的运行对象的运行时特征之后,本发明实施例提供的信息处理方法进入步骤S3,即:根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
由于在步骤S2中介绍记录需要被记录的运行对象的运行时特征的时候,已经介绍了如何根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的具体原理,所以在此为了说明书的简洁,就不再赘述了。
请继续参考图2,如图2所示,在具体实施过程中,为了将监听器记录下的需要被记录的运行对象的运行时特征实时地提供给外部程序,本发明实施例还提供一种服务接口,以方便用户通过该服务接口访问监听器记录下的需要被记录的运行对象的运行时特征,在实际应用中,该服务接口可以通过插件或代理服务程序实现,从而对监听器记录下的需要被记录的运行对象的运行时特征的数据进行格式化,并实时返回给外部程序,这样,只需要通过管理服务接口即可实现对中间件的运行堆栈的监控,灵活性高,可移植性强,在此就不再赘述了。
在实际应用中,中间件默认的加载顺序为:JAVA运行时环境的扩展依赖→JVM启动命令行显示指定的类路径(CLASSPATH)→中间件的公共依赖(包括国际化程序包、与后端数据库文件系统交互的驱动程序)→支撑中间件服务器运行的程序包和共享类库→应用程序依赖→应用程序,运行时可见性自上而下是由全局可见到局部可见。在多工程服务端应用中,客户端使用不同的上下文根路径确定具体哪个应用程序,如果监听器配置在中间件服务配置文件的顶层,则对全部工程有效;如果配置在工程内部,则仅对当前工程有效,也可将监听器部署到应用程序内部,通过业务调用触发,实现监听器的延迟加载。当服务端有各种监控需求时,会涉及不同层次的监听器配置管理工作,诸多开发工具里提供了对配置文件的可视化更改,但这些都不能帮助维护人员推演监听器的加载顺序,配置调测工作繁杂。
监听器部署的位置会决定其运行时加载的顺序,进而影响其运行时的可见性,较晚加载的程序对预先加载的程序不可见,通过显式的引入(JVM的import)和反射机制(JVM的Class.For Name)等会提示类找不到的错误,因此需随运行对象部署位置做出相应调整。本发明实施例提出一种可以预览组件加载顺序的方法,以辅助监听器配置,其具体思路是:首先根据配置文件节点排列顺序、嵌套关系对应用程序进行扫描,例如可以使用SAX(Simple API for XML,一个用于处理XML事件驱动的“推”模型,并得到了广泛认可的API)等XML(EXtensible Markup Language,可扩展标记语言)文件解析工具实现,找到各监听器对中间件服务组件、第三方类的相对顺序;其次对中间件服务组件、第三方类所属的层次进行界定,对顺序进行调整,最终得到一个加载顺序预览。
本发明实施例提供两种部署方式,请同时参考图6A和图6B,图6A和图6B是本发明实施例对于多个运行对象处于不同的加载顺序层级的情况的部署示意图,如图6A所示,单独部署服务接口会较繁琐,因此,可以如图6B所示,可以将全局监控对象集中部署到服务接口内部,并由目标对象被动方式访问,可以将服务接口提升到较高的优先级,避免了服务接口的重复部署。
通过上述部分可以看出,由于采用了在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象,并记录需要被记录的运行对象的运行时特征,并根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的技术方案,不会直接访问中间件的运行堆栈中的运行对象,而是记录该运行对象的运行时特征,并根据该运行时特征,确定出发生内存泄露的运行对象对应的应用程序中的业务模块,对实际业务没有侵入性,所以解决了现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题,减小了对生产环境的侵入性,从而实现了在确定了发生内存泄露的运行对象对应的应用程序中的业务模块的同时,保证了生产环境正常运行的技术效果。
进一步地,由于采用了通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,并对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,并在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象的技术方案,不需要通过人为经验判断来确定发生内存泄露的对象,所以避免了现有技术中需要丰富的人为经验判断才能够确定出有发生内存泄露的对象的缺陷,提高了需要被记录的运行对象的准确性,从而降低了系统记录需要被记录的运行对象的资源消耗。
基于同一发明构思,本发明实施例还提供一种信息处理装置,请参考图7,图7是本发明实施例提供的信息处理装置的功能模块图,如图7所示,该信息处理装置包括:
第一确定单元701,用于在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象;
记录单元702,用于记录需要被记录的运行对象的运行时特征;
第二确定单元703,用于根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块。
在具体实施过程中,第一确定单元701具体用于通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,对象摘要列表为按照占据运行堆栈的存储容量从大到小的方式对运行对象排序后的列表,并对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数,并在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象。
在具体实施过程中,装置还包括屏蔽单元,用于在获得位于对象摘要列表中前M位的M个运行对象之前,屏蔽对象摘要列表中的指定运行对象,以及屏蔽在引用队列上的数量小于第二预设门限值的运行对象,第二预设门限值小于第一预设门限值。
在具体实施过程中,记录单元702具体用于记录需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录需要被记录的运行对象建立套接字连接的目标地址和端口号;第一确定单元703,具体用于基于第一线程堆栈信息和第二堆栈线程堆栈信息,确定运行堆栈内的发生内存泄露的运行对象对应的应用程序中的业务模块;和/或基于建立套接字连接的目标地址和端口号,确定运行堆栈内的发生内存泄露的运行对象对应的应用程序中的业务模块。
在具体实施过程中,记录单元702具体还用于记录需要被记录的运行对象的实例化数量,并建立实例化数量与运行堆栈之间的对应关系。
本实施例中的信息处理装置与前述实施例中的信息处理方法是基于同一发明构思下的两个方面,在前面已经对方法的实施过程作了详细的描述,所以本领域技术人员可根据前述描述清楚的了解本实施例中的信息处理装置的结构及实施过程,为了说明书的简洁,在此就不再赘述了。
上述本发明实施例中的技术方案,至少具有如下的技术效果或优点:
1、由于采用了在中间件运行时,确定中间件的运行堆栈中需要被记录的运行对象,并记录需要被记录的运行对象的运行时特征,并根据运行时特征,确定需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块的技术方案,不会直接访问中间件的运行堆栈中的运行对象,而是记录该运行对象的运行时特征,并根据该运行时特征,确定出发生内存泄露的运行对象对应的应用程序中的业务模块,对实际业务没有侵入性,所以解决了现有技术中存在的通过堆内存分析定位发生内存泄露的位置的方式具有较大的侵入性,继而导致中间件业务响应停滞的技术问题,减小了对生产环境的侵入性,从而实现了在确定了发生内存泄露的运行对象对应的应用程序中的业务模块的同时,保证了生产环境正常运行的技术效果。
2、由于采用了通过运行堆栈的对象摘要列表,获得位于对象摘要列表中前M位的M个运行对象,并对运行堆栈执行全量垃圾搜集处理,并确定M个运行对象中位于对象摘要列表中前M位的N个运行对象,并在N个运行对象在中间件的引用队列上的数量超过第一预设门限值时,确定N个运行对象为需要被记录的运行对象的技术方案,不需要通过人为经验判断来确定发生内存泄露的对象,所以避免了现有技术中需要丰富的人为经验判断才能够确定出有发生内存泄露的对象的缺陷,提高了需要被记录的运行对象的准确性,从而降低了系统记录需要被记录的运行对象的资源消耗。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (8)
1.一种信息处理方法,其特征在于,包括:
在中间件运行时,确定所述中间件的运行堆栈中需要被记录的运行对象;包括:通过所述运行堆栈的对象摘要列表,获得位于所述对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,所述对象摘要列表为按照占据所述运行堆栈的存储容量从大到小的方式对运行对象排序后的列表;对所述运行堆栈执行全量垃圾搜集处理,并确定所述M个运行对象中位于所述对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数;在所述N个运行对象在所述中间件的引用队列上的数量超过第一预设门限值时,确定所述N个运行对象为所述需要被记录的运行对象;
通过中间件的监听器记录所述需要被记录的运行对象的运行时特征;具体为:在所述需要被记录的运行对象初始化时,记录所述运行时特征;以及在所述需要被记录的运行对象销毁时,回收所述运行时特征;
根据所述运行时特征,确定所述需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块;其中,未被回收的所述运行时特征对应的运行对象为发生内存泄露的运行对象。
2.如权利要求1所述的方法,其特征在于,在所述获得位于所述对象摘要列表中前M位的M个运行对象之前,所述方法还包括:
屏蔽所述对象摘要列表中的指定运行对象,以及屏蔽在所述引用队列上的数量小于第二预设门限值的运行对象,所述第二预设门限值小于所述第一预设门限值。
3.如权利要求1所述的方法,其特征在于,所述记录所述需要被记录的运行对象的运行时特征,具体为:记录所述需要被记录的运行对象初始化的第一线程堆栈信息和销毁时的第二线程堆栈信息;或者,记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号;
所述根据所述运行时特征,确定所述运行堆栈内的发生内存泄露的运行对象对应的业务,具体为:基于所述第一线程堆栈信息和所述第二线程堆栈信息,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块;或者,基于所述建立套接字连接的目标地址和端口号,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块。
4.如权利要求3所述的方法,其特征在于,在所述记录所述需要被记录的运行对象初始化的第一线程堆栈信息以及销毁时的第二线程堆栈信息和/或记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号的同时,所述方法还包括:
记录所述需要被记录的运行对象的实例化数量,并建立所述实例化数量与所述运行堆栈之间的对应关系。
5.一种信息处理装置,其特征在于,包括:
第一确定单元,用于在中间件运行时,确定所述中间件的运行堆栈中需要被记录的运行对象;具体用于:通过所述运行堆栈的对象摘要列表,获得位于所述对象摘要列表中前M位的M个运行对象,其中M为大于等于2的整数,所述对象摘要列表为按照占据所述运行堆栈的存储容量从大到小的方式对运行对象排序后的列表,并对所述运行堆栈执行全量垃圾搜集处理,并确定所述M个运行对象中位于所述对象摘要列表中前M位的N个运行对象,其中N为小于等于M的正整数,并在所述N个运行对象在所述中间件的引用队列上的数量超过第一预设门限值时,确定所述N个运行对象为所述需要被记录的运行对象;
记录单元,用于通过中间件的监听器记录所述需要被记录的运行对象的运行时特征;具体为:在所述需要被记录的运行对象初始化时,记录所述运行时特征;以及在所述需要被记录的运行对象销毁时,回收所述运行时特征;
第二确定单元,用于根据所述运行时特征,确定所述需要被记录的运行对象中的发生内存泄露的运行对象对应的应用程序中的业务模块;其中,未被回收的所述运行时特征对应的运行对象为发生内存泄露的运行对象。
6.如权利要求5所述的装置,其特征在于,所述装置还包括屏蔽单元,用于在所述获得位于所述对象摘要列表中前M位的M个运行对象之前,屏蔽所述对象摘要列表中的指定运行对象,以及屏蔽在所述引用队列上的数量小于第二预设门限值的运行对象,所述第二预设门限值小于所述第一预设门限值。
7.如权利要求5所述的装置,其特征在于,所述记录单元具体用于记录所述需要被记录的运行对象初始化的第一线程堆栈信息和销毁时的第二线程堆栈信息;或者,记录所述需要被记录的运行对象建立套接字连接的目标地址和端口号;
所述第二确定单元,具体用于基于所述第一线程堆栈信息和所述第二线程堆栈信息,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块;或者,基于所述建立套接字连接的目标地址和端口号,确定所述运行堆栈内的所述发生内存泄露的运行对象对应的所述应用程序中的业务模块。
8.如权利要求7所述的装置,其特征在于,所述记录单元具体还用于记录所述需要被记录的运行对象的实例化数量,并建立所述实例化数量与所述运行堆栈之间的对应关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410009405.1A CN104778087B (zh) | 2014-01-09 | 2014-01-09 | 一种信息处理方法以及信息处理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410009405.1A CN104778087B (zh) | 2014-01-09 | 2014-01-09 | 一种信息处理方法以及信息处理装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104778087A CN104778087A (zh) | 2015-07-15 |
CN104778087B true CN104778087B (zh) | 2019-04-12 |
Family
ID=53619568
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410009405.1A Active CN104778087B (zh) | 2014-01-09 | 2014-01-09 | 一种信息处理方法以及信息处理装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104778087B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102922B (zh) * | 2017-04-01 | 2020-08-07 | 北京三快在线科技有限公司 | 内存检测方法、装置及电子设备 |
CN107766155A (zh) * | 2017-10-23 | 2018-03-06 | 北京京东尚科信息技术有限公司 | 对象处理方法及系统 |
CN111949528A (zh) * | 2020-08-05 | 2020-11-17 | 北京字节跳动网络技术有限公司 | 内存泄漏的检测方法、装置、电子设备和存储介质 |
CN112506485B (zh) * | 2020-12-14 | 2024-07-02 | 苏州华兴源创科技股份有限公司 | 业务处理系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1752941A (zh) * | 2004-09-20 | 2006-03-29 | 华为技术有限公司 | 一种内存监控的装置及方法 |
CN101339533A (zh) * | 2007-07-04 | 2009-01-07 | 国际商业机器公司 | 基于分区的诊断Java系统的内存泄漏的方法及装置 |
US20090228870A1 (en) * | 2008-03-06 | 2009-09-10 | International Business Machines Corporation | On-demand monitoring of memory usage |
CN101615143A (zh) * | 2008-06-27 | 2009-12-30 | 国际商业机器公司 | 用于内存泄漏诊断的方法和装置 |
CN101639804A (zh) * | 2008-07-29 | 2010-02-03 | 国际商业机器公司 | 确定程序中的内存泄漏位置的方法和装置 |
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现系统 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100511158C (zh) * | 2007-08-28 | 2009-07-08 | 中兴通讯股份有限公司 | 一种内存监控管理的方法及系统 |
CN101593152B (zh) * | 2009-06-25 | 2011-07-27 | 青岛海信移动通信技术股份有限公司 | 一种移动终端内存泄漏检测方法及装置 |
CN101599048B (zh) * | 2009-07-01 | 2012-02-22 | 福建星网锐捷网络有限公司 | 一种内存监控的方法和装置 |
US8522216B2 (en) * | 2010-05-04 | 2013-08-27 | Oracle International Corporation | Memory leak detection |
CN102073591A (zh) * | 2011-01-14 | 2011-05-25 | 福建星网视易信息系统有限公司 | 嵌入式系统内存占用状况检测方法及系统 |
CN103294588A (zh) * | 2012-02-22 | 2013-09-11 | 深圳富泰宏精密工业有限公司 | 内存检测系统及方法 |
-
2014
- 2014-01-09 CN CN201410009405.1A patent/CN104778087B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1752941A (zh) * | 2004-09-20 | 2006-03-29 | 华为技术有限公司 | 一种内存监控的装置及方法 |
CN101339533A (zh) * | 2007-07-04 | 2009-01-07 | 国际商业机器公司 | 基于分区的诊断Java系统的内存泄漏的方法及装置 |
US20090228870A1 (en) * | 2008-03-06 | 2009-09-10 | International Business Machines Corporation | On-demand monitoring of memory usage |
CN101615143A (zh) * | 2008-06-27 | 2009-12-30 | 国际商业机器公司 | 用于内存泄漏诊断的方法和装置 |
CN101639804A (zh) * | 2008-07-29 | 2010-02-03 | 国际商业机器公司 | 确定程序中的内存泄漏位置的方法和装置 |
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现系统 |
Also Published As
Publication number | Publication date |
---|---|
CN104778087A (zh) | 2015-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9529692B2 (en) | Memory management tools | |
CN108027722B (zh) | 在编译和部署中动态更新应用 | |
US8122292B2 (en) | Debugging of business flows deployed in production servers | |
US9483257B2 (en) | Universal and adaptive software development platform for data-driven applications | |
US20190102278A1 (en) | Memory leak profiling events | |
US8196116B2 (en) | Tracing objects in object-oriented programming model | |
JP2009516239A (ja) | コンピュータアプリケーションの追跡及びモニタリングを行う汎用のマルチインスタンスメソッド及びgui検出システム | |
CN105308578B (zh) | 状态转变的诊断 | |
US7603659B2 (en) | Activating assertions and breakpoints | |
CN104380264A (zh) | 运行时间检测报告 | |
CN104778087B (zh) | 一种信息处理方法以及信息处理装置 | |
US20100050157A1 (en) | System and process for debugging object-oriented programming code | |
US7426716B2 (en) | Recovery and representation of object interaction in an object oriented program | |
US10241895B2 (en) | Memory stack trace management tool | |
CN107968833A (zh) | 一种基于执行路径的云应用性能监测方法 | |
CN109542444A (zh) | Java应用的监控方法、装置、服务器和存储介质 | |
CN112604273B (zh) | 数据驱动的游戏系统功能加载方法、设备及存储介质 | |
CN114185874A (zh) | 一种基于大数据的建模方法、装置、开发框架及设备 | |
US10496524B2 (en) | Separating test coverage in software processes using shared memory | |
US20070143678A1 (en) | Method and apparatus for persistently resolving events to event source | |
CN114077575B (zh) | 用于内存快照文件的格式转换方法、设备和系统 | |
CN116028310A (zh) | 一种应用程序的性能分析方法及装置 | |
CN110008035A (zh) | 数据接口扩展方法、数据处理方法、装置及设备 | |
CN104063229A (zh) | 一种数字家庭中间件系统 | |
CN108553899A (zh) | 一种即点即玩游戏的开发装置及其方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |