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多线程内存管理以及可见性

JMM(java内存模型) 描述Java程序中各种内存(线程共享变量)的访问规则。所有变量都存在于主内存中,每个线程都有自己独立的工作内存,线程间不可以直接互相操作其工作内存中的变量,以及主内存的变量...
  • u013986179
  • u013986179
  • 2016年09月08日 21:42
  • 300

Java内存管理常见面试题

Java垃圾收集器与类的finalize()方法总结 1. 垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃。 2.垃圾收集器判断一个...
  • a382064640
  • a382064640
  • 2015年11月11日 15:29
  • 1963

面试总结:java程序执行过程 + JVM内存管理 + GC垃圾回收机制

java程序执行过程 +JVM内存管理 + GC垃圾回收机制1、Java程序执行过程一个java程序的编译和执行过程如下: .java ——编译——> .class 类加载器负责加载各个字节码文件(....
  • u010429424
  • u010429424
  • 2017年08月17日 19:15
  • 461

java自动内存管理机制

java自动内存管理 1.运行时的数据区域         java程序在运行的过程中把它所管理的内存划分为若干个区域分别是:         1. 方法区      2. 虚拟机栈       3....
  • peterchan88
  • peterchan88
  • 2016年10月31日 10:14
  • 568

深入理解Java虚拟机——自动内存管理机制

特此申明: 前段时间找工作所以看了这本书,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处。不过无所谓啦,写出来自己看看,需要的朋友参考下,仅此而已。 一:Ja...
  • yingminxing
  • yingminxing
  • 2012年11月22日 10:23
  • 3313

Java自动内存管理机制(一) JVM、Class

关于JVM的内存回收机制,内容概念非常多,非一篇博文所能详尽。所以这里只截取重要部分。详细之处可参阅相关书籍或博客: 《深入理解Java虚拟机-JVM高级特性与最佳实践》 周志明 著1.JVM概念 ...
  • u012440687
  • u012440687
  • 2016年07月25日 09:03
  • 761

java内存管理和垃圾回收机制

我们知道,java所谓的跨平台特性(hardware- and operating system-independence)是依赖于JVM的。也就是,JAVA代码写好了之后会被编译成java的字节,一...
  • u010223904
  • u010223904
  • 2015年08月28日 10:48
  • 2081

C/C++内存管理与Java内存的各种分配

最近在看一些面试题,于是就查找了java与C/C++在内存上的差异 Java的内存管理实质上就是JVM的内存管理   JVM的内存分为两部分:stack和heap   Stack...
  • Losteng
  • Losteng
  • 2016年03月10日 23:03
  • 1237

Lua内存管理

Lua  要求用户给出一个内存管理函数,在 Lua创建虚拟机的时候传入。。  它利用 C 标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理...
  • liutianshx2012
  • liutianshx2012
  • 2015年01月19日 17:00
  • 1352

java内存管理(堆、栈、方法区)

java内存管理简介  首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉...
  • Liveor_Die
  • Liveor_Die
  • 2017年09月08日 15:46
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 内存管理
举报原因:
原因补充:

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