(6)java的内存泄露问题

一:什么是内存泄露
--->Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现
--->内存泄露的定义:对于应用程序来说,当对象已经不再被使用,但是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露。要理解这个定义,我们需要理解对象在内存中的状态。
如下图所示,展示了哪些对象是无用对象,哪些是未被引用的对象;

---->上图中包含了未引用对象和引用对象。未引用对象将会被垃圾回收器回收,而引用对象却不会。未引用对象很显然是无用的对象。然而,无用的对象并不都是未引用对象,有一些无用对象也有可能是引用对象,这部分对象正是内存泄露的来源。

二:为什么会发生内存泄露
---->让我们用下面的例子来看看为什么会发生内存泄露。如下图所示,对象A引用对象B,A的生命周期(t1-t4)比B的生命周期(t2-t3)要长,当 B在程序中不再被使用的时候,A仍然引用着B。在这种情况下,垃圾回收器是不会回收B对象的,这就可能造成了内存不足问题,因为A可能不止引用着B对象, 还可能引用其它生命周期比A短的对象,这就造成了大量无用对象不能被回收,且占据了昂贵的内存资源。

---->同样的,B对象也可能引用着一大堆对象,这些被B对象引用着的对象也不能被垃圾回收器回收,所有的这些无用对象消耗了大量内存资源。

三:怎样阻止内存泄露

以下是一些阻止内存泄露的经验提示:

多关注集合类,比如HashMap,ArrayList等,这些对象经常会发生内存泄露。比如当它们被声明为静态对象时,它们的生命周期会跟应用程序的生命周期一样长,很容易造成内存不足。
多关注事件监听(listeners)和回调(callbacks),比如注册了一个listener,当它不再被使用的时候,忘了注销该listener,可能就会产生内存泄露。
“如果一个类自己管理自己的内存空间,开发人员需要特别警惕内存泄露”,引用其它对象的成员变量记得要置为null?不太理解(原文:Often times member variables of an object that point to other objects need to be null out);

时间: 2024-08-02 21:43:21

(6)java的内存泄露问题的相关文章

java造成内存泄露原因

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在J

java web 内存泄露问题

问题描述 java web 内存泄露问题 在做web项目,需要从数据库一次读取多个数据,然后填充到bean里放入list,这样在循环读取的时候每次都要创建一个bean对象,之前访问量小没什么,现在访问量大了,程序占用越来越高,这应该怎么办? 解决方案 看下有没有对象在持续引用bean对象,特别是静态成员.把jvm的内存调大 解决方案二: Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存.因此,很多程序员认

再谈java的内存泄露

这两天看了一本老书<bitter java>,第一次系统地了解了所谓"反模式".就书的内容来说已经过于陈旧,书中提到的magic servlet.复合jsp等等反模式已经是早就熟知的编程禁忌,而如web页面不能有太多元素这样的反模式也因为ajax的出现(异步加载)变的不是那么"反模式"了,其中又讲述了很多ejb的反模式,这些在轻量级框架流行的今天也早已经过时.不过书中有一个章节倒是挺有价值,讲述的是java的内存泄露问题,我认为是我目前读的关于这方面问题

测试Java Applet内存泄露(非开发环境)

问题描述 我有一个VB.NET开发的桌面程序,里面调用了IE浏览器控件,连接到一个URL,这个URL包含有一个JavaApplet.现在怀疑这个Java小程序有内存泄露的问题,最后导致我的程序运行越来越慢,直到崩溃.但是这个JavaApplet并不是我们开发的,而是国外制造的一个小设备产生的(这个小设备只有一根网线接口,不能接鼠标键盘控制,只知道里面运行了Linux).我如何收集数据,证明这个JavaApplet的对或错呢?我先使用了JProbe和YourKitJavaProfiler,发现它们

JAVA程序内存泄露问题

问题描述 使用quartz每20秒执行一次任务,任务中使用kettle做了一系列的数据抽取转换.程序跑了12个小时后内存从100上升到400.使用jmap导出内存查看后发现内存增长后组要是Unreachableobjects占用在增长.以下是Unreachableobjects的明细图:请问又没有朋友遇到过这样的情况,或者有什么排查的好办法? 解决方案 解决方案二:等待学习--解决方案三:quartz的线程初始化是10个,看下线程是不是一直在增加解决方案四:该回复于2011-03-25 13:2

Java内存泄露问题分析

很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程序员自己管理内存,Java内存是由GC自动回收的. 我虽然不是很熟悉C++,不过这个应该没有犯常识性错误吧. 2.什么是内存泄露? 内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃. 在C/C++中分配了内存不释放的情况就是内存泄露. 3.Java存在内存泄露 我们必须先承认这个

java内存泄露的理解与解决

java内存管理机制 在c++ 语言中,如果需要动态分配一块内存,程序员需 要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导 致内存的泄露. java 语言对内存管理做了自己的优化,这就是垃圾回收机制. java 的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由 gc ( garbage collection)负责自动回收不再使用的内存. 上面是java 内存管理机制的基本情况.但是如

java内存泄露是错误还是异常

问题描述 今天去掏宝面试,被问到"java的内存泄露是错误还是异常?"我答:是错误我不知道答得对不对?请大家说说!! 解决方案 解决方案二:个人愚见:如果内存泄露的消息被java反馈回来,并有警示消息那么应该是异常,应该说所谓"异常"就是被程序捕获的错误,超出程序预期的目的或者计划.如果内存泄露后,未能捕获进而引发了灾难性的后果,例如主程序崩溃或者蓝屏死机,那么就是应该是错误.能否捕获并处理是区分是否是错误或者异常的关键,这个题目感觉出的很模糊,java的内存泄露到

如何用Java编写一段代码引发内存泄露

Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中): 应用程序创建一个长时间运行的线程(或者使用线程池,会更快地发生内存泄露). 线程通过某个类加载器(可以自定义)加载一个类. 该类分配了大块内存(比如new byte[1000000]),在某个静态变量存储一个强引用,然后在ThreadLocal中存储它自身的引用.分配额外的内存new byte[