内存管理是一个很大的话题,也和产品的成功息息相关。很多人可能为linux的丰富性易用性而欢呼。但是忽略了很多重要的点,抛去实时性,由成千上万个开源软件组成的linux上层软件对于内存泄漏以及内存碎片而言,这个问题是无解的,换而言之,一旦产品使用linux上电后,最终结果是内存耗尽,系统崩掉。这不是危言耸听。很多人都知道使用linux相关的设备会越跑越慢,最后不得不重启,做得好一点的支撑的时间长一点,做得差的几个小时就出现这样的现象。其背后根本的原因就是内存出现问题。由于linux上层内存管理算法的稀缺只有一个malloc,长期使用后内存碎片无法避免,关键是除了malloc也只有malloc,对于那些频繁申请释放内存的操作最后一定是全部是内存碎片,耗尽系统内存。linux对于由于内存过大无法控制的进程会杀掉!从而保证其它的进程能活下来。这种设计适合于桌面应用的设计,但是绝对不适合工控设备的设计。对于工控设备来说,你把我主要的进程给杀死了,留其它的进程还有什么用呢?头脑已经死了,留下手足还有何用,只是一个死人而已。linux对于内存泄漏所提供的检查机制实在太少,很多时候基于linux的大型的软件系统最麻烦的就是看着内存不断泄漏,但是能做的很有限,支撑一段时间后最终内功耗尽统崩掉。
所以对于那些长时间需要连续运行的重要的设备不建议使用linux,除非用户能够容忍每隔一段时间重启。
本帖最后由 jorya_txj 于 2015-11-24 13:23 编辑
服务器的应用环境比较单一,应用也不会太多,但是手机,电视机,这些就不同了,涉及到大量的开源软件,内存这块很难掌控住。
有什么好办法吗?适合工控的内存管理?楼主能否开贴谈谈?
未必吧,我做过项目也频繁的malloc,只不过malloc大小几乎都相等(30KB左右),查看进程的内存利用几乎都没有变化。如果申请大小不一的内存或许容易产生碎片
据说linux的内存管理有个机制:
如果某进程申请了10M的内存,然后全部释放掉,改内存并不一定变成空闲内存,而是为该进程预留。
下次该进程再次升起1K、2K内存,只要不超过10M都能从原10M里划分。
我以前做过项目应该可以验证上面的叙述:
TCP服务器,刚开始 top 命令查看内存占用很低。
之后服务器被400可客户端连接,内存逐渐升高。
400个客户端断开连接,服务器释放400个链接的内存【我可以肯定已经释放】。
再次 top 命令查看内存没有减小。
200~300个客户端再次连接服务器,内存占用没变化。
客户端连接添加到800个,内存占用超过400个客户端所占用的内存(连接800个客户端大约消耗内存25M)
本帖最后由 lzwml 于 2016-3-2 11:48 编辑
起一个进程,检测主程序的运行就行了,发现异常,就把它杀死,然后再重启它。