什么是内存泄露?内存泄露如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是内存泄露?内存泄露如何解决?相关的知识,希望对你有一定的参考价值。

1、内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

2、一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的,

使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆

中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则

这块内存就不能被再次使用,就是这块内存泄漏了。

3、内存泄露多数属于程序本身设计问题,有以下几种解决方法:

1)从程序内部重新编译。养成良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。

2)结束程序,内存自然就会被操作系统回收。

3)重新启动电脑后,立刻恢复。

参考技术A 百度百科 内存泄露:
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
内存泄漏是常见的问题。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏。尤其是在碰到错误路径的情况下更是如此。本回答被提问者采纳

开发那些事儿:EasyNTS上云网关平台内存泄露是什么原因?如何解决?

EasyNTS上云网关包含组网运维、多协议视频流拉转推等功能,它可以解决内网设备上云、内网业务上云、直播上云、运维上云等上云需求,通过端口穿透技术,可以将内网的任何网络设备,以IP+端口的形式发布到云端,让处于内网的设备成为一个“云设备”,帮助企业打造“虚拟云主机”。

有用户反馈,EasyNTS运行pprof一段时间后,内存持续增长。运行30个小时后,从启动时的1.2%飙升到33%,并在2周时间左右系统因内存而崩溃。我们对此情况立刻进行了排查与分析。

1)查看pprof,发现了几个占用内存较大的函数。

 StatisticalFlow函数是用于统计流量输入输出的,每30秒执行一次,其中嵌套了多级for循环。每个循环里面还嵌套了网络请求及defer Body.CLose() 。

defer表示函数结束后执行,for循环表示函数永远不会结束,这就导致每30秒都有一定量的defer压入函数栈帧中,无限增大,无法释放。当函数栈不够用时,又去申请更大的内存空间,将旧的数据拷贝过去,并且一直重复这个过程。

从代码结构上来看也极其糟糕,在for循环里面嵌套了多个for循环,层级就有4级,如下图所示:

再看另外一个函数,记录设备下线日志,此处每个客户端会创建至少一个协程,并在for循环里每15秒创建一个无法回收的定时器。

在加载配置中,右侧调用可以看到有非常多的调用,每次调用都要重新加载配置。因为返回的是指针,会逃逸到堆上,直到垃圾回收才清理。

以上分析结果均是导致用户EasyNTS内存泄露的原因。根据以上分析,可通过以下办法解决内存问题:

1)删除defer,在资源使用完毕后立即关闭;

2)定时器创建在for循环外面;

3)重构函数,每个函数尽量不要超过60行;

4)配置相关使用单例模式。

EasyNTS上云网关可应用在多种场景中,如远程办公、在线课堂、虚拟直播等,当然也可以进行各种上云服务,如果大家还想了解更多相关内容,欢迎持续关注我们的更新,也欢迎大家联系我们探讨更多内容。

以上是关于什么是内存泄露?内存泄露如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

JS内存泄露

ASP.NET程序如何测试内存泄露

PHP CURL内存泄露的解决方法

Mono源码阅读-GC造成内存泄露问题

delphi olevariant 内存泄露怎么解决

qt编程,怎么能避免内存泄露