SOCKET句柄泄露带来的内存灾难
前些时候游戏莫名其妙出现大量内存泄露,我感到很诧异,当然一般情况下游戏的内存管理是极其严苛的,出现如此大量的内存泄露到底是怎么回事?
句柄滥用导致的内存泄露会多夸张呢,尤其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句柄泄露带来的内存灾难的更多相关文章
- .NET对象与Windows句柄(三):句柄泄露实例分析
在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象, ...
- .NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子
上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象 ...
- ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...
- 牛客网Java刷题知识点之内存溢出和内存泄漏的概念、区别、内存泄露产生原因、内存溢出产生原因、内存泄露解决方案、内存溢出解决方案
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- windbg调试实例(4)--句柄泄露
同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...
- JavaScript内存泄露,闭包内存泄露如何解决
本文原链接:https://cloud.tencent.com/developer/article/1340979 JavaScript 内存泄露的4种方式及如何避免 简介 什么是内存泄露? Java ...
- linux句柄泄露问题查看
背景: 我们在开发linux在线server的时候常常会遇会句柄泄露的问题.由于在linux系统设计里面遵循一切都是文件的原则.即磁盘文件.文件夹.网络套接字.磁盘.管道等,全部这些都是文件.在我们进 ...
- 捉虫记2:windows程序句柄泄露的上下文环境
作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...
- (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
http://my.oschina.net/jsan/blog/11169 http://blog.csdn.net/tianma630/article/details/8502395 jQuery ...
随机推荐
- Hive之 hive-1.2.1 + hadoop 2.7.4 集群安装
一. 相关概念 Hive Metastore有三种配置方式,分别是: Embedded Metastore Database (Derby) 内嵌模式Local Metastore Server 本地 ...
- 代码规范 for node.js with 'npm-coding-style'
npm-coding-style npm's "funny" coding style Description npm's coding style is a bit unconv ...
- LeetCode 177. Nth Highest Salary
https://leetcode.com/problems/nth-highest-salary/description/ Write a SQL query to get the nth highe ...
- [置顶]
caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
由于虚拟机下的Ubuntu系统一般不包含GPU,故这次安装时为了在无GUP环境下运行caffe.所以只需安装CPU版本的caffe 由于本机是window10系统,所以想尝试caffe就在自己电脑上整 ...
- Python之单元测试框架unittest
创建class继承unittest,每一个测试用例是以test开头的函数,先执行setup,然后用例按照字母的顺序执行,然后执行teardown import unittest class demo( ...
- 20165233 实验二 Java面向对象程序设计
20165233 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- 原生态Vim使用快捷键
我的第一篇博客,凌晨2点加班不想睡,随便写点.本人菜鸟一个,努力学习,争取成为大神.. 第一篇写点什么东西呢,我目前是搞运维的,俗话说"工欲善其事必先利其器",Vim作为最基本的工 ...
- nginx正向代理访问百度地图API
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...
- Fatal error: Cannot use object of type PHPExcel_RichText as array
Fatal error: Cannot use object of type PHPExcel_RichText as array 上传导入Excel的时候会出现此问题,问题的原因是Excel表格中有 ...
- MPI 集合通信函数 MPI_Scatterv(),MPI_Gatherv(),MPI_Allgatherv(),MPI_Alltoall(),MPI_Alltoallv(),MPI_Alltoallw()
▶ 函数 MPI_Scatterv() 和 MPI_Gatherv() .注意到函数 MPI_Scatter() 和 MPI_Gather() 只能向每个进程发送或接受相同个数的元素,如果希望各进程获 ...