CN109828916B - 一种解决内存泄漏的方法和系统 - Google Patents
一种解决内存泄漏的方法和系统 Download PDFInfo
- Publication number
- CN109828916B CN109828916B CN201811646263.4A CN201811646263A CN109828916B CN 109828916 B CN109828916 B CN 109828916B CN 201811646263 A CN201811646263 A CN 201811646263A CN 109828916 B CN109828916 B CN 109828916B
- Authority
- CN
- China
- Prior art keywords
- memory
- child process
- child
- shared memory
- parent
- 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
Images
Landscapes
- Debugging And Monitoring (AREA)
- Multi Processors (AREA)
Abstract
本发明实施例提供了一种解决内存泄漏的方法和系统,通过对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。可以在已知被调用层存在内存泄漏的情况下,仍然可以放心的调用其接口而不会使调用层因此产生内存泄漏。
Description
技术领域
本发明涉及通信技术领域,尤其涉及一种解决内存泄漏的方法和系统。
背景技术
在计算机软件系统实际开发过程中,经常碰到内存泄漏的问题,解决办法一般是使用相应的工具逐步调试定位程序代码,把导致内存泄漏的代码找出来修正,但是如果没有该模块的代码则此办法就行不通。有的时候即使有代码,但是代码量太大,结构很复杂,导致查找定位修改起来成本太高,在实际项目开发中可操作性很低。
还有一种内存泄漏是调用方式或使用场景导致的,如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标识的共享内存中,然后子进程退出。
步骤25、当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层D。
所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层D之前,清理所述共享内存。
本实施例中父进程根据PID标识使用非阻塞方式等待子进程执行,非阻塞方式支持了非泄漏调用层D的多线程、多进程方式。
子进程执行结束后退出,由操作系统进程运行原理可知,子进程里产生的内存泄漏随着子进程的退出而由操作系统回收了,从而避免了非泄漏调用层D的内存泄漏,父进程根据SMID读取结果,然后清理SMID的共享内存,最后把结果返回给非泄漏调用层D。
实施例二
该实施例提供了一种解决内存泄漏的系统,其具体实现结构如图3所示,其应用于泄漏调用层以及非泄漏调用层,具体可以包括如下的模块:
创建模块31:其用于对所述泄漏调用层创建父进程;
其用于对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;
其还用于创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;
写入模块32:其用于将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;
读取模块33:其用于当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。
所述创建模块31具体用于:预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。
所述创建模块31具体用于:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。
所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。
所述写入模块32具体用于使所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。
所述读取模块33具体用于在所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。用本发明实施例的系统解决内存泄漏的具体过程与前述方法实施例类似,此处不再赘述。
综上所述,本发明实施例通过对所述泄漏调用层创建父进程;对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。可以在已知被调用层存在内存泄漏的情况下,仍然可以放心的调用其接口而不会使调用层因此产生内存泄漏。
本领域普通技术人员可以理解:附图只是一个实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (12)
1.一种解决内存泄漏的方法,其应用于泄漏调用层以及非泄漏调用层,其特征在于,包括:
对所述泄漏调用层创建父进程;
对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;
创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;
将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;
当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。
2.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,包括:
预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。
3.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述创建与所述父进程相关联的子进程,包括:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。
4.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述敏感代码包括:导致内存泄漏的代码和/或第三方接口代码。
5.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。
6.根据权利要求1所述的一种解决内存泄漏的方法,其特征在于,所述所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。
7.一种解决内存泄漏的系统,其应用于泄漏调用层以及非泄漏调用层,其特征在于,包括:
创建模块:其用于对所述泄漏调用层创建父进程;
其用于对所述父进程创建共享内存,以使所述父进程与所述父进程相关联的子进程通过所述共享内存通信,其中所述共享内存具有共享标识;
其还用于创建与所述父进程相关联的子进程,其中所述子进程具有子进程标识;
写入模块:其用于将所述泄漏调用层的敏感代码存入所述子进程中执行,并将执行结果写入所述共享内存,以使所述父进程根据所述子进程标识在所述共享内存中等待所述子进程执行;
读取模块:其用于当所述子进程执行结束后退出,所述父进程根据所述共享标识读取所述子进程的执行结果,并返回至所述非泄漏调用层。
8.根据权利要求7所述的一种解决内存泄漏的系统,其特征在于,包括:
所述创建模块具体用于预先采用共享内存的方式定义所述父进程与所述子进程之间的通信数据。
9.根据权利要求7所述的一种解决内存泄漏的系统,其特征在于,所述创建模块具体用于:在调用有内存泄漏的接口之前,使用Linux下fork函数创建所述与所述父进程相关联的子进程。
10.根据权利要求7所述的一种解决内存泄漏的系统,其特征在于,所述敏感代码包括:导致内存泄漏的的代码和/或第三方接口代码。
11.根据权利要求7所述的一种解决内存泄漏的系统,其特征在于,所述写入模块具体用于使所述父进程根据所述子进程标识在所述共享内存中采用非阻塞方式等待所述子进程执行。
12.根据权利要求7所述的一种解决内存泄漏的系统,其特征在于,所述读取模块具体用于在所述父进程将读取所述子进程的执行结果返回至所述非泄漏调用层之前,清理所述共享内存。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811646263.4A CN109828916B (zh) | 2018-12-29 | 2018-12-29 | 一种解决内存泄漏的方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811646263.4A CN109828916B (zh) | 2018-12-29 | 2018-12-29 | 一种解决内存泄漏的方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109828916A CN109828916A (zh) | 2019-05-31 |
CN109828916B true CN109828916B (zh) | 2023-04-21 |
Family
ID=66861425
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811646263.4A Active CN109828916B (zh) | 2018-12-29 | 2018-12-29 | 一种解决内存泄漏的方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109828916B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112256339B (zh) * | 2019-07-22 | 2023-11-03 | 百度在线网络技术(北京)有限公司 | 多进程管理方法、装置、电子设备和存储介质 |
CN110502891B (zh) * | 2019-08-08 | 2021-06-15 | 北京字节跳动网络技术有限公司 | 一种获取进程内存泄露的方法、装置、介质和电子设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现系统 |
CN105760275A (zh) * | 2016-02-22 | 2016-07-13 | 汉柏科技有限公司 | 一种基于Linux的监控用户态进程内存状态方法及系统 |
CN106681933A (zh) * | 2016-11-16 | 2017-05-17 | 深圳市金立通信设备有限公司 | 一种内存管理方法及终端 |
CN106934303A (zh) * | 2015-12-29 | 2017-07-07 | 大唐高鸿信安(浙江)信息科技有限公司 | 基于可信芯片的可信操作系统创建可信进程的系统及方法 |
CN108021823A (zh) * | 2017-12-04 | 2018-05-11 | 北京元心科技有限公司 | 基于可信执行环境无痕运行应用程序的方法、装置和终端 |
JP2018147203A (ja) * | 2017-03-06 | 2018-09-20 | 日本電気株式会社 | 情報漏洩防止装置、情報漏洩防止方法および情報漏洩防止プログラム |
CN108664394A (zh) * | 2018-04-10 | 2018-10-16 | 北京奇安信科技有限公司 | 一种内存泄露过程追溯方法及装置 |
CN108733567A (zh) * | 2018-05-24 | 2018-11-02 | 北京智芯微电子科技有限公司 | 软件资源泄露情况的监测方法及系统 |
-
2018
- 2018-12-29 CN CN201811646263.4A patent/CN109828916B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103064784A (zh) * | 2012-11-29 | 2013-04-24 | 福建师范大学 | 面向Xen环境的运行时内存泄漏检测方法及其实现系统 |
CN106934303A (zh) * | 2015-12-29 | 2017-07-07 | 大唐高鸿信安(浙江)信息科技有限公司 | 基于可信芯片的可信操作系统创建可信进程的系统及方法 |
CN105760275A (zh) * | 2016-02-22 | 2016-07-13 | 汉柏科技有限公司 | 一种基于Linux的监控用户态进程内存状态方法及系统 |
CN106681933A (zh) * | 2016-11-16 | 2017-05-17 | 深圳市金立通信设备有限公司 | 一种内存管理方法及终端 |
JP2018147203A (ja) * | 2017-03-06 | 2018-09-20 | 日本電気株式会社 | 情報漏洩防止装置、情報漏洩防止方法および情報漏洩防止プログラム |
CN108021823A (zh) * | 2017-12-04 | 2018-05-11 | 北京元心科技有限公司 | 基于可信执行环境无痕运行应用程序的方法、装置和终端 |
CN108664394A (zh) * | 2018-04-10 | 2018-10-16 | 北京奇安信科技有限公司 | 一种内存泄露过程追溯方法及装置 |
CN108733567A (zh) * | 2018-05-24 | 2018-11-02 | 北京智芯微电子科技有限公司 | 软件资源泄露情况的监测方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109828916A (zh) | 2019-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102354536B1 (ko) | 하이퍼레저 패브릭 네트워크 구축 방법과 컨트롤러 및 저장 매체 | |
CN107391104B (zh) | 一种客户端与react native代码的更新依赖管理方法、装置及系统 | |
CN109828916B (zh) | 一种解决内存泄漏的方法和系统 | |
CN107179982B (zh) | 一种跨进程调试方法和装置 | |
CN107122656B (zh) | 一种通过自调试防止外部调试的方法和装置 | |
CN109558143B (zh) | 一种集群中部署应用的方法及装置 | |
CN114510296A (zh) | 一种小程序存储调用方法、装置以及设备 | |
CN107092517B (zh) | 一种sdk工具包的生成方法及装置 | |
CN107301097B (zh) | 一种调用java对象、java对象的引用地址信息的存储方法及装置 | |
CN105630672A (zh) | 应用的自动监控方法及装置 | |
CN109840133A (zh) | 应用功能的运行方法及装置 | |
CN114168389B (zh) | Cad文件的恢复方法、装置、存储介质及处理器 | |
CN115827028A (zh) | 系统的升级方法、装置、存储介质以及电子设备 | |
CN115904785A (zh) | 一种异常定位方法、装置、设备及可读存储介质 | |
CN115203050A (zh) | 一种服务的依赖关系的确定方法及装置 | |
CN111158940B (zh) | 物联网领域的不同设备的对接和动态加载的方法和装置 | |
CN109117180B (zh) | 一种程序集成方法及装置 | |
CN106055322A (zh) | 一种流程调度方法及装置 | |
CN111045812A (zh) | 一种区块链智能合约反向调用方法、设备及介质 | |
CN112579145A (zh) | 应用部署方法及装置 | |
CN112905109B (zh) | 消息处理方法、装置、设备及存储介质 | |
CN113687973B (zh) | 一种日志动态化输出的控制方法、设备及介质 | |
CN112988460B (zh) | 一种虚拟机的数据备份方法及装置 | |
CN116225461A (zh) | 一种数据处理方法、装置、计算机设备及存储介质 | |
CN111625463B (zh) | 一种程序状态检测方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |