Java 内存泄漏

Java 中内存是如何管理的程序员

为了判断Java中是否有内存泄露,咱们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员须要经过关键字new为每一个对象申请内存空间 (基本类型除外),全部的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工做。但同时,它也加剧了JVM的工做。这也是Java程序运行速度较慢的缘由之一。由于,GC为了可以正确释放对象,GC必须监控每个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都须要进行监控。编程

监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象再也不被引用。函数

下面请看示例:工具


public class Main{
public static void main(String args[]){
Object obj1= new Object();//obj1
Object obj2= new Object();//obj2
obj2= obj1;
//此处为第6行
}
}
1
2
3
4
5
6
7
8
9测试

内存的释放,也即清理那些不可达的对象,是由GC决定和执行的,因此GC会监控每个对象的状态,包括申请、引用、被引用和赋值等。释放对象的根本原则就是对象不会再被使用:对象

`给对象赋予了空值null,以后再没有调用过。`
`另外一个是给对象赋予了新值,这样从新分配了内存空间。`
1
2
什么是Java中的内存泄露生命周期

  Java中的内存泄露,广义并通俗的说,就是:再也不会被使用的对象的内存不能被回收,就是内存泄露。事件

  Java中的内存泄露与C++中的表现有所不一样。内存

  在C++中,全部被分配了内存的对象,再也不使用后,都必须程序员手动的释放他们。因此,每一个类,都会含有一个析构函数,做用就是完成清理工做,若是咱们忘记了某些对象的释放,就会形成内存泄露。开发

  可是在Java中,咱们不用(也没办法)本身释放内存,无用的对象由GC自动清理,这也极大的简化了咱们的编程工做。但,实际有时候一些再也不会被使用的对象,在GC看来不能被释放,就会形成内存泄露。

 &emspl;经过分析,咱们得知,对于C++,程序员须要本身管理边和顶点,而对于Java程序员只须要管理边就能够了(不须要管理顶点的释放)。经过这种方式,Java提升了编程的效率。

所以,经过以上分析,咱们知道在Java中也有内存泄漏,但范围比C++要小一些。由于Java从语言上保证,任何对象都是可达的,全部的不可达对象都由GC管理。

下面给出了一个简单的内存泄露的例子。在这个例子中,咱们循环申请Object对象,并将所申请的对象放入一个Vector中,若是咱们仅仅释放引用自己,那么Vector仍然引用该对象,因此这个对象对GC来讲是不可回收的。所以,若是对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Vector v=new Vector(10);

for (int i=1;i<100; i++){
Object o=new Object(http://www.my516.com);
v.add(o);
o=null;
}
//此时,全部的Object对象都没有被释放,由于变量v引用这些对象。
1
2
3
4
5
6
7
8
如何防止内存泄漏的发生?

 好的测试工具

  在开发中不能彻底避免内存泄漏,关键要在发现有内存泄漏的时候能用好的测试工具迅速定位问题的所在。市场上已有几种专业检查 Java 内存泄漏的工具,它们的基本工做原理大同小异,都是经过监测 Java 程序运行时,全部对象的申请、释放等动做,将内存管理的全部信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括 Optimizeit Profiler、JProbe Profiler、JinSight、Rational 公司的 Purify 等。

 注意像 HashMap 、ArrayList 的集合对象

  特别注意一些像 HashMap 、ArrayList 的集合对象,它们常常会引起内存泄漏。当它们被声明为 static 时,它们的生命周期就会和应用程序同样长。

 注意 事件监听 和 回调函数

  特别注意 事件监听 和 回调函数 。当一个监听器在使用的时候被注册,但再也不使用以后却未被反注册。

总结:

  综上所述,Java也存在内存泄露问题,其缘由主要是一些对象虽然再也不被使用,但它们仍然被引用。为了解决这些问题,咱们能够经过软件工具来检查内存泄露,检查的主要原理就是暴露出全部堆中的对象,让程序员寻找那些无用但仍被引用的对象。---------------------

相关文章
相关标签/搜索