软件开发过程中需要考虑的另一个重要资源是内存。一般的软件开发者不会意识到这一点,因为640KB RAM电脑的时代早已成为过去。但是一个内存泄漏的程序会把服务器糟蹋成640KB电脑。内存消耗不仅仅是关注程序使用了多少内存,还应该考虑控制程序使用内存的数量。 有一些开发项目,比如嵌入式系统开发,就会要求开发者关注内存配置,因为这类系统的资源是相当有限的。但是,普通开发者总希望目标系统能够提供他们需要的RAM。 随着RAM和高级编程语言都开始支持自动内存管理(比如垃圾回收机制),开发者不需要关注内存优化了,系统会帮忙完成的。 跟踪程序内存的消耗情况比较简单。最基本的方法就是使用操作系统的任务管理器。它会显示很多信息,包括程序占用的内存数量或者占用总内存的百分比。任务管理器也是检查CPU时间使用情况的好工具。在下面的截图中,你会发现一个简单的Python程序(就是前面那段程序)几乎占用了全部CPU(99.8%),内存只用了0.1%。 用这样的工具(Linux系统在命令行用top命令),可以轻松检测内存泄漏问题,不过这也要根据程序的具体情况综合考虑。如果你的程序在持续加载数据,那么其内存消耗的比例,可能会与那些没有频繁使用外部资源的程序不同。 例如,如果我们把一个调用大量外部资源的程序的内存消耗随时间的变化描绘出来,可能如下图所示。 资源加载时,内存使用曲线出现高峰;资源释放时,曲线会下降。虽然程序的内存消耗变化有点儿大,但是我们可以统计没有加载资源时程序的内存消耗的平均值。只要确定了这个平均值(图中用矩形表示),就可以判断内存泄漏的情况。 让我们再看一个资源加载效果比较糟糕的程序的内存消耗图(没有完全释放资源)。 在上图中你会发现,每当资源不再使用时,占用的内存并没有完全释放,这时内存消耗曲线就会位于矩形之上。这就表示程序会消耗越来越多的内存,即使加载资源已经释放也是如此。 同理,也可以检测那些没有负载的程序的内存消耗情况,把执行特定任务的程序运行一段时间。有了数据,就很容易检测内存消耗和内存泄漏情况了。 让我们来看一个例子: 当运行过程启动之后,内存消耗会在一个范围内不断增加。如果发现增幅超出范围,而且消耗增大之后一直没有回落,就可以判断出现内存泄漏了。 一个内存泄漏的例子如下图所示。