|
登录论坛,更多趣闻美图好福利!
您需要 登录 才可以下载或查看,没有帐号?注册
x
今天又内存不足了,客户端闪退,导致错过了一个BOSS,少了好多领悟,心好痛。其实关于这个问题,一直都没有很好的解决,当然,这个问题也确实很难处理。
基于我在相关领域的一些经验,我认为内存不足客户端崩溃,差不多以下三点原因
1.真的内存不够了。
但是我的机器内存是16G的,除去操作系统占用部分内存,我不相信16G内存还不够用,毕竟是家用PC机,不是服务器,16G内存绝对够用了。所以我个人猜测,是产生了内存泄露
什么是内存泄露呢?
首先,游戏里面的任何东西,都需要先申请一片内存,然后基于内存进行操作。
比如,游戏里面一个BOSS,就是在内存中先申请一块区域,保存BOSS的相关信息,然后BOSS的移动、攻击都是基于这一块内存区域进行操作。当BOSS被干掉的时候,就需要吧这块内存区域清除,或者说回收。如果不进行内存回收,那么可用内存会越来越少,最后就会发现内存不足,程序崩溃。这种该释放的内存没有得到释放导致内存不足的情况,我们称为内存泄露。
2.空指针
还是接着上面的例子,我们在内存中申请一块区域保存BOSS信息,保存之后怎么操作呢?任何的内存空间,都是有地址的,比如32位系统的寻址空间是2的32次方,那么32位系统的内存地址是不大于2的32次方的一个数字。每一个内存空间,都有一个对应的内存地址指向它,我们称这种内存地址为指针。通过指针,就能操作内存中的数据,从而操作BOSS的移动、攻击等。如果我们在操作指针的时候,这个指针并没有指向任何内存空间,而是指向的一个空值,就会出现空指针的异常,导致程序退出。
3.野指针
继续套用上面的例子,为一个BOSS申请一块内存,得到一个指向该内存区域的指针。当BOSS挂掉,将该内存回收。但是回收的同时,指针本身还继续保留,那么当别的地方申请了这一块内存的同时,原指针就可以继续对这一块数据操作,就有可能产生冲突,这样可能会引发问题。注意是可能,意思是程序运行99次没问题,但是第100次就挂了,客户端崩溃了。这种情况是随机出现的。
出现以上三种情况,一般都是代码写的不够严谨,对于内存的处理不够到位。如果能找到具体的代码位置,解决起来还是很容易的。但是游戏发展到现在,代码已经很庞大了,可能都不比OS内核的代码要少,所以很难定位具体问题在哪。
基于以上,个人提一个建议:
当程序崩溃的时候,是可以生成一个dump文件的,该文件会记录程序崩溃前的堆栈信息。如果发生了客户端崩溃,可以弹出一个会话框,让玩家选择是否上传文件,当玩家点击上传,就将dump文件提交给服务器,KFZ的工程师拿到dump文件,就可以分析出大致哪里出问题了,也许能找到一些原因能进行修复。
|
|