内存泄露:那个占着茅坑不拉屎的赶紧出来

 

程序员老司机给设计师讲解:什么是内存泄露。...



梅沙科技团队每天上午有10多分钟的晨会时间,某天,程序员老司机Mask说解决了内存泄露问题,设计师表示不是很明白。

内存泄露是一个互联网产品研发当中很基础的问题,无论产品经理、设计师都应该知道的常识,于是,BLUES让Mask写一篇文章,目标是我们的设计师看完之后,能清楚什么是内存泄露。

于是就有了下面的文章,文章中的案例来自我们的APP:梅沙教育,文章后面有二维码,长按可以下载,结合文章进行体验。

《给设计师看的内存泄漏科普文》

在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

0x00 有味道的解释

上面是维基百科上的解释,很准确。但是如果你想这样去给设计MM解释,估计你是想体验传说中的注孤身吧。

通俗来讲,内存泄漏就是占着茅坑不拉屎。真正想上厕所的人来到洗手间,发现里面有人(假设所有洗手间都显示有人),啪唧,拉裤子里了。咦~这酸爽,才够味。

上面说的茅坑对应的就是内存。占着茅坑(内存)不拉屎(工作),让需要使用茅坑(内存)的人(程序)无法使用那个茅坑(内存)拉屎(工作),你说是不是浪费?泄漏的另一个意思不就是浪费吗?比如天然气泄漏,泄漏掉的那部分天然气是不是就浪费了?所以内存泄漏其实也可以说成内存浪费,只不过泄漏显示逼格高点不是?(手动微笑)

说好的给设计师看呢?No picture you say jb.

看图说话。

0x01 举个例子

APP运行起来是需要内存的,就像鱼儿离不开水。假设我们梅沙教育APP在手机里跑起来能分到10个茅坑(内存),这是固定的,所以得计划着来用这10个茅坑(内存)。

这是我们的推荐页面:



假设我们打开APP显示推荐页面需要占用2个茅坑(内存)。

现在我们开始浏览APP了,我们看到第一个营团的小女孩挺可爱的,点开看一看:



我们看到这个营团详情了,但是之前已经说了,任何页面的展示都是需要茅坑(内存)的,我们假设这个详情页面展示需要占用1个茅坑(内存)。

这样我们现在的APP就用掉了3个茅坑(内存)了对吧,推荐页面用掉2个,这个详情页面用掉1个。

看完这个详情页面后,我们发现这个页面介绍的营团不是我想要的,于是就按了左上角的返回按钮,回到推荐页面。

正常情况下这个详情页面所占用的那1个茅坑(内存)就应该让出来了,这样我们就还有8个茅坑(内存)可以用,推荐页面占用着2个茅坑(内存)。

但是,由于我们的详情页面因为某些原因,并没有在关闭该详情页面的时候让出这1个茅坑(内存)。这就导致了一个问题了,实际现在我们已经回到推荐页面了,它占用了2个茅坑(内存),这是正常的,但是已经关闭掉的详情页面还占用着1个茅坑(内存),可我们并没有在浏览这个详情页面了,这是不正常的。就浪费了1个茅坑(内存)。

浪费了也就浪费了吧,反正我们还有7个茅坑(内存)可以用呢。

这里需要说明一点,每个新的页面所需要的茅坑(内存)只能从剩余的茅坑中分配,已经被占用的茅坑(内存)是不能被别人使用的,就像生活中的一样。

刚刚那个营团不是我们想报名的,于是我们回到推荐页面继续寻觅,发现另一个营团好像挺有意思的,点进去看一下:



于是,展示这个营团详情又需要1个茅坑(内存),从剩下的7个茅坑(内存)中选1个呗。现在我们占用了多少个茅坑(内存)了?没错,4个!推荐页面占用2个,第一个营团详情占用1个(被浪费的),这个营团详情占用1个。这样我们还没有被占用的茅坑就只剩下6个了。

我们发现这个营团也不是我想要的。于是又点击左上角的返回按钮回到推荐页面了。注意,刚刚已经说明了,由于我们的详情页面代码有问题,导致在点击返回按钮关闭详情页面时并没有让出它所占用的那1个茅坑(内存),正常情况是需要让出来的。因此,这个营团详情又浪费了1个茅坑(内存)。(迷之微笑)

到这里我们发现问题没?

那就是在浏览不同营团详情的时候,我们所用去的茅坑(内存)越来越多,用完茅坑(内存)后,却并没有按照剧本那样让出茅坑(内存)。前面我们也说了,梅沙教育APP被分配的可使用茅坑(内存)只有10个!我的天呐!如果我们一直这样下去的话,我们10个茅坑(内存)很快就会被占用完,那我打开新页面又需要茅坑(内存)怎么办?没了!没了就导致APP崩溃了呗。(哭成狗)

所以,很多的APP崩溃,就是一不小心把茅坑用完了,内存泄露了,虽然是常识,但即使是老司机,也有掉坑里的时候。

0x02 总结

到这里我们应该明白了,所谓内存泄漏,就是被占用的茅坑(内存)在需要让出来的时候,由于某些原因(最大可能就是代码写得有问题)并没有让出茅坑(内存),导致这个茅坑(内存)被浪费了,别人无法再使用这个茅坑(内存)了,因为这个茅坑看起来一直在被使用,就像厕所门一直显示里面有人,外面的人就没法进去用。

而对于APP来说,内存泄漏最终可能导致茅坑(内存)被占用完,再需要新的茅坑(内存)时,APP就崩溃了。

0x03 引用文献

  1. https://zh.wikipedia.org/zh-hans/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F
  2. https://www.v2ex.com/t/188792


=========

大家看完之后,还有问题么,如果有,欢迎留言,BLUES请老司机Mask进行解答。

梅沙科技是一个年轻的团队,我们创建半年,上线的产品有梅沙教育的H5版本、iOS客户端、安卓客户端、梅沙教育管理后台,从功能、交互、视觉到性能,都有很多需要提升的,无论如何,我们先把产品做出来,快速给用户使用,再快速优化,不怕做不好,就怕不进步,一起努力吧!

欢迎扫描二维码,下载【梅沙教育】APP




================

梅沙科技招聘

欢迎大家给梅沙科技推荐前端程序员、后端程序员、UI设计师。

简历发送到到BLUES的邮箱:

blues@meishakeji.com

50871416@qq.com

==========

公众号作者BLUES(兰军)梅沙科技(www.meishakeji.com)创始人;公众号ID:bluemidou;原创3年自媒体,原迅雷产品总监,腾讯、YY语音高级产品经理,欢迎留言交流。

点击关键词阅读相关文章:

产品经理能力体系    面试     校园招聘    程序员

运营体系       数据分析     大数据体系

数据运营       留存率

产品可用性测试(上)     (中)    (下)

30岁的焦虑       产品经理的黑魔法  

欢迎扫描二维码关注BLUES公众号:




点击阅读原文,进入:梅沙教育


    关注 BLUES


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册