一种解决内存泄漏的方法和系统技术方案

技术编号:21246811 阅读:22 留言:0更新日期:2019-06-01 07:15
本发明专利技术实施例提供了一种解决内存泄漏的方法和系统,通过对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。可以在已知被调用层存在内存泄漏的情况下,仍然可以放心的调用其接口而不会使调用层因此产生内存泄漏。

A Method and System for Solving Memory Leakage

The embodiments of the present invention provide a method and system for resolving memory leaks by creating a parent process through the leak call layer, creating shared memory for the parent process so that the parent process and the child process associated with the parent process communicate through the shared memory, in which the shared memory has a shared identity, and creating a child process associated with the parent process. The child process has a child process identity; the sensitive code of the leak call layer is stored in the child process and executed, and the execution result is written into the shared memory. The parent process reads the execution result of the child process according to the shared identity and returns to the non-leak call layer. In the case of known memory leak in the invoked layer, it is still safe to call its interface without causing memory leak in the invoked layer.

【技术实现步骤摘要】
一种解决内存泄漏的方法和系统
本专利技术涉及通信
,尤其涉及一种解决内存泄漏的方法和系统。
技术介绍
在计算机软件系统实际开发过程中,经常碰到内存泄漏的问题,解决办法一般是使用相应的工具逐步调试定位程序代码,把导致内存泄漏的代码找出来修正,但是如果没有该模块的代码则此办法就行不通。有的时候即使有代码,但是代码量太大,结构很复杂,导致查找定位修改起来成本太高,在实际项目开发中可操作性很低。还有一种内存泄漏是调用方式或使用场景导致的,如java服务进程使用多线程并发调用openssl开源库接口。openssl是常用的开源库,虽然整个库支持多线程调用,但是实际使用发现很多接口都存在比较明显的内存泄漏,由于其代码量大、结构复杂,如果采用直接修改代码的方式来修正内存泄漏的问题就变得异常困难。采用java实现的web服务后台是以单进程java虚拟机的形式运行,为了提高对外服务性能内部采用多线程并发形式,这种常用方式调用openssl会导致内存泄漏,随着业务量的增长最终造成服务进程因耗尽内存资源而被操作系统杀掉。急需一种解决方案可以在已知被调用层存在内存泄漏的情况下,仍然可以放心的调用其接口而不会使调用层因此产生内存泄漏。
技术实现思路
本专利技术的实施例提供了一种解决内存泄漏的方法和系统。本专利技术提供了如下方案:对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。根据本专利技术的上述方法,包括:预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。根据本专利技术的上述方法,所述创建与所述父进程相关联的子进程,包括:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。根据本专利技术的上述方法,所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。根据本专利技术的上述方法,所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。根据本专利技术的上述方法,所述所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。根据本专利技术的另一方面,还提供一种解决内存泄漏的系统,其应用于泄漏调用层以及非泄漏调用层,包括:创建模块:其用于对所述泄漏调用层创建父进程;其用于对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;其还用于创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;写入模块:其用于将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;读取模块:其用于当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。根据本专利技术的另一方面,所述创建模块具体用于预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。根据本专利技术的另一方面,所述创建模块具体用于:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。根据本专利技术的另一方面,所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。根据本专利技术的另一方面,所述写入模块具体用于使所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。根据本专利技术的另一方面,所述读取模块具体用于在所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。由上述本专利技术的实施例提供的技术方案可以看出,本专利技术实施例通过对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。可以在已知被调用层存在内存泄漏的情况下,仍然可以放心的调用其接口而不会使调用层因此产生内存泄漏。附图说明为了更清楚地说明本专利技术实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本专利技术实施例一的应用场景;图2为本专利技术实施例一提供的一种解决内存泄漏的方法的处理流程图;图3为为本专利技术实施例一提供的一种解决内存泄漏的系统的系统模块图。具体实施方式为便于对本专利技术实施例的理解,下面将结合附图以几个具体实施例为例做进一步的解释说明,且各个实施例并不构成对本专利技术实施例的限定。实施例一本实施例提供了一种解决内存泄漏的实现方法,该方法实现了安全的调用有内存泄漏的模块接口,如附图1所示,泄漏调用层B有内存泄漏,但是非泄漏调用层D感知不到,调用层及其更上层的系统不会表现出有内存泄漏现象。本实施例针对此问题提供如下的方法,本实施例的一种解决内存泄漏的方法的处理流程如图2所示,其应用于泄漏调用层B以及非泄漏调用层D包括:步骤21、对所述泄漏调用层创建父进程;步骤22、对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;其中,需要预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。本实施例中父进程根据定义的数据结构创建一个有共享标识SMID的共享内存,父进程、子进程之间通过SMID读取、写入数据,此SMID要求唯一、可区分是为了支持非泄漏调用层D多线程、多进程方式。步骤23、创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;所述创建与所述父进程相关联的子进程,包括:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。本实施例中创建的子进程才用子进程标识PID进行标识,fork函数的特性是由此产生的子进程可以继承此函数之前的所有变量值,这就省去了父进程向子进程传递参数的过程;也可以实现在不改变泄漏调用层B参数的情况下对其重新封装。步骤24、将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。本实施例中把敏感代码放到子进程中执行,结果写入到SMID标识的共享本文档来自技高网...

【技术保护点】
1.一种解决内存泄漏的方法,其应用于泄漏调用层以及非泄漏调用层,其特征在于,包括:对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。

【技术特征摘要】
1.一种解决内存泄漏的方法,其应用于泄漏调用层以及非泄漏调用层,其特征在于,包括:对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。2.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,包括:预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。3.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述创建与所述父进程相关联的子进程,包括:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。4.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。5.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。6.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。7.一种解决内存泄漏的系统,其应用于泄漏调用层以及非泄...

【专利技术属性】
技术研发人员:赵永宽宁红宙
申请(专利权)人:航天信息股份有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1