java 内存管理

转载 2012年03月27日 13:22:22

今天主要想总结下关于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内存泄漏问题带来帮助。

相关文章推荐

java内存管理总结

  • 2012-04-12 10:03
  • 60KB
  • 下载

java高性能代码的内存管理

GC是一段程序,不是智能,他只回收他认为的垃圾,而不是回收你认为的垃圾。GC垃圾回收机制: 首先,JVM在管理内存的时候对于变量的管理总是分新对象和老对象。(新对象也就是开发者new出来的对象,但是由...

java内存管理的小技巧

  • 2011-11-24 14:18
  • 160KB
  • 下载

java的内存管理

java的内存管理 1. java是如何管理内存的  Java的内存管理就是对象的分配和释放问题。(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过...

java 内存管理白皮书

  • 2011-09-21 11:38
  • 7.47MB
  • 下载

java 内存管理总结

  • 2011-05-12 18:03
  • 64KB
  • 下载

java内存管理、继承、和向上造型

一.对象的内存管理 JVM的内存分为:堆 栈 和 方法区,由JVM来进行分配管理 1) 堆:存储使用new关键字所创建的对象 1.1 new出来的对象包括成员变量 1.2 成员变量的生命周期:...

java内存管理 ppt

  • 2010-12-07 16:11
  • 119KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)