最近的项目一直有out of memory或者reset的问题,初步调查了下发现和message的生命周期有关。
正常了来说,message的生命周期分为3个阶段,在Messages调试窗口可以观察到
1,消息的生成,即send
2,消息的分发,即deliver
3,消息的释放,即free
Send
app或者系统库在传递消息时,肯定是需要一块内存来保存将要传递的消息的。
不论这个消息是
即时发送,使用MessageSend函数
或者
稍后发送,使用MessageSendLater函数
或者
条件发送,使用MessageSendConditionally函数
等等。
VM都需要申请一定的内存来保存这个消息。
在Messages调试窗口中,Send后面的数字就是发送该消息的时机,负数代表过去,正数代表将来。
例如-1ms表示在打印这条消息的1毫秒前已经发出去了。50ms表示我已经通知VM了让他50毫秒以后把这条消息分发出去。
Deliver
然后VM根据发送的要求,调用对应的task message handler来接收这个函数。
而从消息真正发送,到处理这条消息的回调函数接收到这条消息,的时间,就是deliver的时间。
比如VM在某个时刻已经按照send的要求,发出了消息,但是现在有别的函数要处理,等处理这条消息的函数进场,已经过去了20ms,
那么,在Messages调试窗口中就会在deliver后面看到-20ms。
如果deliver后面是0ms,那就是说VM一抛出这条消息,这条消息处理函数就进场了。显然所有deliver都这样那就完美了。
Free
等这条消息处理函数退出时,消息本身占用的内存才会被释放掉。就打印一条free。
===
而我现在的状况就是,消息已经发出了,处理函数一直不进场,deliver平均在25ms以上。
然后send的消息越来越多,free的速度跟不上,最终导致out of memory。