尾递归和内存泄漏

  尾递归在并发编程中的重要性在这里变得很明显。因为你不知道将会调用多少次这个函数,你必须确保它在常量的内存空间内执行,

当每次处理一个消息的时候不会增加递归调用堆栈。每分钟处理数千次以上的消息,且持续数小时,数天,数月或者数年都是很常见的!

使用尾递归,接受/计算函数的最后一件事是调用自己,这样你就可以确保没有内存泄漏地不间断运行了

  当一个消息和receive声明中的所有语句都不匹配的时候会发生什么呢?它会无限制地停留在信箱中,这就造成了内存泄漏,随着时间

的推移这还可能导致运行时系统内存溢出和崩溃。因此不处理未知消息应视为一个错误。要么刚开始就不应该发送这些消息到这个进程,

要么处理它们,可能只是从信箱中取出并忽略掉。

  忽视未知消息的防御性办法是在receive语句中使用 “无关紧要” 变量,虽然这个方法很方便,但它可能并不是一个最好的办法。首先没有被

处理的消息也许就不应该发送到这个进程。如果它们是有意发送的,他们可能因为recieve语句中的一个编程错误而不能匹配。抛弃这些消息只会

把发现错误变的更困难。如果抛弃了未知的消息,请一定要记录它们的出现,这样做至少以后可以比较容易地发现和纠正这些错误。

 

摘自 《Erlang编程指南》 114页

你可能感兴趣的:(内存泄漏)