最近项目在进行对外测试,在服务器上线几个小时后,内存飙到了5.8G(预期2G),JVM一直在GC。
由于现场太大(dump有6G左右)和网络条件不理想,我们边下载dump边开着自己的测试服务器来模拟少量玩家游戏并且通过图形化工具来监视内存中的重量级对象,如玩家、场景等。最后在发现玩家缓存过期清空后,玩家的实例对象一直都没有被GC掉,然后通过工具找出了两个主要的内存泄漏点:
- 对象池中的对象回收后还一直持有玩家对象的强引用。
- 一些定时器的生命周期超出了持有者的生命周期,一直持有者玩家对象的强引用并且该定时器一直没有严格按照生命周期进行管理。
最后,我觉得在业务频繁更改的情况下一定要保持好对业务对象的封装,按照严格的生命生命周期去使用,不然代码没有健壮性,改一个Bug然后生产100个新Bug。
原文地址:https://www.cnblogs.com/jason-koo/p/8428753.html
时间: 2024-11-09 01:00:01