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内存管理机制

  • 2014年06月24日 13:58
  • 32KB
  • 下载

java内存管理详细介绍

  • 2014年05月18日 23:17
  • 301KB
  • 下载

《深入理解Java虚拟机》学习小记一之自动内存管理机制(三)

目录[-] 概要 对象优先分配在Eden分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 概要 在Java技术体系中,自动内存管...
  • cq1982
  • cq1982
  • 2015年06月09日 17:20
  • 415

关于java内存管理的一些理解

  • 2017年11月22日 14:33
  • 195KB
  • 下载

java内存管理总结

  • 2012年04月12日 10:03
  • 61KB
  • 下载

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C、C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确...

java内存管理的小技巧

  • 2011年11月24日 14:18
  • 160KB
  • 下载

java内存管理 ppt

  • 2010年12月07日 16:11
  • 119KB
  • 下载

Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵...

JAVA虚拟机的内存管理

  • 2012年03月23日 15:45
  • 371KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 内存管理
举报原因:
原因补充:

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