前些时候游戏莫名其妙出现大量内存泄露,我感到很诧异,当然一般情况下游戏的内存管理是极其严苛的,出现如此大量的内存泄露到底是怎么回事?

句柄滥用导致的内存泄露会多夸张呢,尤其SOCKET,在某些客户端系统下,短短5个小时可以吃掉5GB以上内存,有甚者达到6GB,并且进程内存查看非常完好,并无激增,那内存去哪了?看看我们的排错过程。

排错过程:

1、首先我们第一反应还是内存泄露,但是观察进程发现占用非常合理,并没有丝毫的激增情况,甚至运行周期后还会出现下降的情况,此类情况用资源管理器和性能管理器可以进行排错,从而进一步确定不是游戏本身所申请的内存泄露。

这里包含 MALLOC,NEW等方式。

为了安全期间,采用VLD进行内存泄露排错,预计结果和我猜测的一样,并无激增或泄露。

此处步骤必须,用于排除激增或可能存在激增的内存问题,在LINUX下有其他库请自己查找,至于此地由于是客户端泄露,采用的VLD库用于内存泄露排错。

2、其次我们发现是系统在申请并归属于该进程的一块内存区域,就像共享内存一样,此时已经初步认定为句柄未释放导致的内存泄露,那么如何定位?

首先要让内存产生泄露,然后请出PCHunter,启动后找到游戏目标进程,右键查看进程句柄。

此时可以看到句柄数已经非常异常,数量高达1182个之多,有些进程甚至过万,这是明显的异常,除非一般的服务端进程,通常情况下句柄数不会达到如此之数。

然后要定位是什么句柄导致的系统内存激增,通过数量分析发现有一项神奇过多:

File \Device\Afd 0x00000B38 0xFFFFE0005183E070 30 32758

此处的 \Device\Afd  为关键,该类型代表为SOCKET句柄,此处已经彻底定位到原因,是SOCKET创建句柄但未释放导致的异常。

3、以上方法已经定位到基本错误,确定是SOCKET,但是怎么知道是哪里呢,这就要监控所有SOCKET创建的地方,我这里是因为使用了第一个第三方的PING库,而这个库代码只创建SOCKET不关闭SOCKET。

所以产生以上问题,简单解决只要关闭不使用SOCKET即可解决,重点在于定位是异常难的,所以特写此文。

SOCKET句柄泄露带来的内存灾难的更多相关文章

  1. .NET对象与Windows句柄(三):句柄泄露实例分析

    在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象, ...

  2. .NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子

    上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象 ...

  3. ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...

  4. 牛客网Java刷题知识点之内存溢出和内存泄漏的概念、区别、内存泄露产生原因、内存溢出产生原因、内存泄露解决方案、内存溢出解决方案

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  5. windbg调试实例(4)--句柄泄露

    同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...

  6. JavaScript内存泄露,闭包内存泄露如何解决

    本文原链接:https://cloud.tencent.com/developer/article/1340979 JavaScript 内存泄露的4种方式及如何避免 简介 什么是内存泄露? Java ...

  7. linux句柄泄露问题查看

    背景: 我们在开发linux在线server的时候常常会遇会句柄泄露的问题.由于在linux系统设计里面遵循一切都是文件的原则.即磁盘文件.文件夹.网络套接字.磁盘.管道等,全部这些都是文件.在我们进 ...

  8. 捉虫记2:windows程序句柄泄露的上下文环境

    作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...

  9. (转)IE内存泄露,iframe内存泄露造成的原因和解决方案

    http://my.oschina.net/jsan/blog/11169 http://blog.csdn.net/tianma630/article/details/8502395 jQuery ...

随机推荐

  1. fusionjs uber开源的通用web插件化开发框架

    fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ...

  2. 对ashx请求用Gzip,Deflated压缩

    //GZIP压缩 //查看请求头部 string acceptEncoding = context.Request.Headers["Accept-Encoding"].ToStr ...

  3. sysstat工具

    sysstat工具可以监控系统的IO,CPU,SWAP,LOAD,NETWORK,DISK 安装后,系统会生成定时任务脚本 路径:/etc/cron.d/sysstat 内容: # Run syste ...

  4. C Socket编程之Connect超时 (转)

    网络编程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口编程中,提到超时的概念,我们一下子就能想到3个:发送超时,接收超时,以及select超时(注:select函数并不是只 ...

  5. [原创]JEECMS 自定义标签调用广告版位下的所有广告(利用广告管理管理首页幻灯片)

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  6. unity里面的gameobject和transform的关系

    一切都是物体(gameobject),而transform是物体的一个基本属性类,包含位置,旋转,缩放,三个基本属性,两者之间可以互相转换 查找物体,建议用transform,GameObject无法 ...

  7. C# 播放器, 收藏

    C#写了一个调用libvlc api实现的万能视频播放器 http://www.cnblogs.com/haibindev/archive/2011/12/21/2296173.html 引用库 ht ...

  8. postman-2get发送请求

    文档地址:https://www.v2ex.com/p/7v9TEc53 第一个API请求 最热主题 相当于首页右侧的 10 大每天的内容. https://www.v2ex.com/api/topi ...

  9. java之扫描包里面的class文件

    一.class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法.但是扫描class就是一个很大的问题了. 二.所以我这里写了一个简单的class文件扫描方式. 三.主要是利 ...

  10. Go语言并发编程总结

    转自:http://blog.csdn.net/yue7603835/article/details/44309409 Golang :不要通过共享内存来通信,而应该通过通信来共享内存.这句风靡在Go ...