zoukankan      html  css  js  c++  java
  • 技能问题引发内存泄漏

    最近,在国服上的新职业技能,包含了一个弱点标记技能。玩家用技能打怪的时候,有一定概率给怪挂上弱点,下次攻击时用另一个技能攻击弱点,能爆出更大伤害。弱点的生命周期大约半分钟,过了以后弱点会消失,玩家退出场景后,弱点也会消失。

    实现的时候,弱点命中情况记在了受害者身上,同时注册监听了一个玩家死亡事件,方便玩家死亡的时候,清理受害者身上记录的玩家命中弱点信息。但是实现的时候,漏掉了反注册监听事件,导致怪物虽然死亡,但是事件管理器上还一直引用着这个对象,引发内存泄漏。

    万幸的是,对于场景服务,之前加上了skynet.memlimit 的2G内存限制。同时,因为同一个场景有多个分线,玩家没法进去的时候,会自己切换到另一个分线继续,所以没酿成重大事故。内存满了的服务,不会再接受call请求,所以玩家继续call的话,会变成玩家上的task堆积

    这个问题修了两次才修好,需要引以为戒。第一次修的时候,换了一套事件管理器,以为新的管理器会自动在怪物死亡时,清理它监听的事件。同时,看日志的时候只看到gc后内存小了,没有具体打印出怪物的数量来排查,测试的时间也比较短,需要一段时间才能看出来漏没漏的。。第二次添加了反注册监听事件就好了

    还有值得改进的,是以后开发这种复杂对象相互引用的,还是能用id就用id,避免错误引用住复杂对象。同时,事件管理器也可以优化一下,a对象关心b对象的事件,当a或者b死亡的时候,就应该清理注册的a关心b的事件,避免手残引起内存泄漏。。

  • 相关阅读:
    android-自定义View
    java
    记录-常用的开发技巧
    便签:
    zTree 树形控件 ajax动态加载数据
    jquery ajax 传数据到后台乱码的处理方法
    spring + quartz 定时
    SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
    复制新项目 ,tomcat部署时名字还是旧项目名
    jsp 通用获取所有表单值传后台
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/npc_memory_leak.html
Copyright © 2011-2022 走看看