关闭

java 内存管理

182人阅读 评论(0) 收藏 举报

今天主要想总结下关于Java内存的管理,很多初学者认为java不会有泄漏情况出现,但是在实际的开发过程中并不是这样。目前至少在我的开发和维护过程中已经碰到几次了。而且越到后面,随着代码的增加将越难查出问题所在(我其中所维护的一个Java服务器有接近十万行的代码量,基本全部的基础框架都是自己开发的,没有大量的使用第三方库)。

网上介绍Java内存的理论和结构分区有很多,在这我就不细说了。不过理论跟实际的开发过程中所碰到的还是有相当大的差距。

不过先还是介绍下最基本防止泄漏原理:

1、资源释放问题(具体的就是数据库连接、socket连接等)

2、避免频繁创建对象;减少对象的生存周期,甚至采用对象池的方式。

3、在某些应用场合,将采用软引用、弱引用和虚引用,我使用较多的是软引用(在进行数据的缓存处理过程中),其它两类应用我还是比较少使用的。

4、方法不要太长,一般一个方法50-200之间比较适合(只作为参考,具体的需要根据项目的要求进行规划)。

5、能使用局部变量,就不要使用成员变量(局部变量的使用可以给GC操作减轻负担),另外静态变量尽量少用。

6、当对象使用完后,其成员变量需要进行赋NULL值处理(协同GC操作)。

7、尽量不要产生一个大对象出现(对于内存泄漏来说也是比较棘手的)。

 

 

以上只是程序在编写时,需要尽量注意的。尽管注意了以上的原则,但是程序在运行时,还是会出现内存泄漏情况。这需要提高对内存泄漏的认识,也就是说不能简单的只从代码角度去考虑问题,需要结合更多其它方面的知识,如操作系统中的线程和进程(对于Java是多线程方面)、数据库原理、锁机制、资源管理等知识,这是非常重要的。

更高的抽象层次,就是把握整个软件框架设计的度,层次交互处理、模块交互等。总之需要整体去考虑问题,因为泄漏是需要考虑各方面很多因素

 

另外有兴趣的可以掌握下C/C++的知识,毕竟Java封装了很多东西。

但是解决Java内存泄漏的一个最终思路:

第一程序中一定存在没有使用,但是还保存在内存里的对象;另外就是对象创建所造成;还有就是并发处理的时候对每个请求的处理时间。

但是最重要的还是前者,它将影响后面的两种情况。

这句话网上有很多人说,也觉得很简单。但是能否找出那些是没有用的对象,这并非易事(甚至有些是JavaJVM本身导致,可参考我的另一篇文章《三种主流的JVM(JDK)使用心得》)。

市面上也有很多关于判断内存泄露的工具,这些工具多少也能提供帮助(可以直接查看线程的运行状态、内存分布情况、GC运行状态等),但是工具也是有不足的,例如:Jprofiler5.0这样的工具,并不支持一些高级的JVM参数(不知道后期版本是否可以支持)

但是这里我介绍下我解决内存泄露的心得(不使用工具):一是日志信息;一是系统开发原理;一是对处理机制掌握。

大家别小瞧了日志信息,在后期的维护过程中,它会给你很多提示。大家也许会小瞧了日志信息(我的同仁就有很多不喜欢进行日志信息的处理),但是我个人认为日志的使用是很有学问的,例如什么情况使用DEBUG级别;什么时候用INFO级别;什么时候用WAR级别等。特别是程序代码量逐渐增加,后面维护日志就显的特别重要。

系统开发原理掌握的好坏,也将影响你判断泄露问题的准确性。如进程、线程、调度管理、存储、I/O等。这方面没有什么技巧,就是需要时间进行大量的学习和实践,这里我推荐一本书《深入计算机系统》很好的讲解了下很多方面的基本知识。

处理机制,简单的说就是业务处理的流程,在维护过程中自己需要对每一点处理的细节都要知道,它也会不经意的给你带来意想不到的线索。

 

最后是在处理这样棘手的问题时,需要有耐心和细心,不要放弃任何可疑点(每个可疑点都将使你离成功更近了),希望这些可以给大家在解决Java内存泄漏问题带来帮助。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1940次
    • 积分:49
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档