带着我经历过两个项目的boss离职了,好遗憾。老同事过来我们组帮忙了,算是一个小小的惊喜。
最近看了《垃圾回收的算法与实现》,说实话,译者的水平比较有限,有几处明显的理解错误。不过,书里的插图还是很易懂的,看着伪代码和插图,勉强读了下来。读完会比较清醒的意识到,即使有gc帮助,还是有可能会有内存泄漏的。月中抽空压测了一下,的确发现了有泄漏。。
我们用的脚本语言是Lua,Lua采用的是标记清除算法,从根出发,搜索不可达对象并回收掉。如果有泄漏,一定是有资源被某个地方引用住了,没有释放。从根里出发,会创建大量的role对象,但玩家下线的时候,明明已经释放对象了的。刚好新加了skynet task指令,发现task只增不减,才找到方向。原来从根出发,除了role对象,还有大量的协程对象。这些对象用于处理计时器、消息队列等设施。消息队列没有消息的时候会将当前协程放入等待队列,有消息再唤醒。而sub消息的handler,往往带有role对象,方便处理消息。玩家下线时,role字典里已经清空对应的role,但是还有沉睡的协程在引用,于是就有泄漏了。消息循环改为停止时唤醒所有睡眠协程,问题就解决了。或许我应该改成插入一个“中断”消息?
一周6天的生活什么时候到头呢?……好想放空自己……