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