关于内存泄漏问题的感受
早先在初步接触编程语言的时候 就了解到一个问题;C++ 对内存泄漏的问题要求很严格,经验少的新手可能稍不注意,就会因为内存泄漏的问题导致程序崩溃;相反 其他的编程语言,比如Java 和C# ,他们就有很好的GC管理器来自动的释放内存;后者两种就是为了解决可能存在的内存问题,而被实现跑在虚拟机上,有一个统一的管理内存的工具。然后事实上,只要你不注意,照样会存在内存泄漏的问题。
当时因为工作方向需要,就义无反顾的选择了C#作为主要的开发语言。后来在接手一个新的项目的时候,框架已经有一个技术大牛写好了,自己主要处理一些维护的工作 ,开发工作也有,因为项目催的紧,没有深入的研究已有的框架,新的开发也是使用了和原来一样的基类来开发的。后来写当时项目的技术大牛提醒过我,说要考虑到内存泄漏的问题;当时根本没在意,自己觉得在使用C#开发的过程中,根本不需要开发人员的过多的考虑内存的问题;后来也没有出现过什么相关的问题,当时哪个项目也就不了了之了。
最近一个项目是从零开始,属于是自己进行框架层的开发任务;项目开发过程中,自己曾多次意识到可能存在内存泄漏的问题,因为一些需求实现的不是很满意,比如:在应用内重置游戏的时候,如何准确、干净的清理掉所有静态的引用,之前在开发的过程中,没有注意到静态类的使用,本来是作为工具类的静态函数,;里面逐渐参杂了数据的内容,这样使用起来确实方便,调试起来也容易,哪里使用直接调用,自己还沾沾自喜;后来发现,这些静态的引用 很难清理干净,写了很多清空和初始化的函数,最后还是没有达到清理干净的目的;从那个时候 ,自己才真的认识到了内存泄漏是一个很严重的问题;但那时面临项目上线的关头,把数据和工具分离了一些,没有做到完全的分离干净,想着从下一个项目开始,再好好规划相关的问题;
就在这几天 ,突然出现了一个很严重的问题;当不重启游戏一直退出再进入游戏,我发现运行速度越来越慢,通过调试后发现,原来之前的数据都没有被清理掉!天!每次刷新的时候 都初始化了一遍之前的数据,比如,进行第10场游戏的时候,依然将之前的9次游戏的数据都初始化了一遍!这简直是致命 的错误!要知道 每一次初始化的过程都有好几处整体的循环遍历的过程,这些都是比较耗费性能的!查到这个问题之后,我瞬间感觉要崩溃了,(程序没奔溃,我先奔溃了),怎么办 ,只能硬着头皮改,分离数据和工具类,全局调用的数据写单例,写重置接口,重新调用,最后,终于,当前的bug解决了,但是我心里还是不踏实,总感觉类似的问题之后的维护过程中还会再次暴露QAQ。
所以,在这里最后总结一下,以后在设计阶段就要将数据和工具分离开 ,工具写静态函数,数据使用单例模式。先说断,后不乱。希望从下一个项目开始i,往后都不再被内存泄漏这个问题所羁绊,希望以后一切顺利!希望看到这个文章的朋友,也能引以为戒!