黑马程序员技术交流社区

标题: 内存泄露问题 [打印本页]

作者: 鲁中需    时间: 2012-10-24 20:07
标题: 内存泄露问题
本帖最后由 鲁中需 于 2012-10-25 21:58 编辑

初学java时,有书上说java中有垃圾回收机制,它可以保证一对象不再被引用的时候被垃圾回收装置自动回收,不必担心内存泄露问题,可随着学习的深入,并不是这么回事,java也有内存泄露问题,可具体原理不是太明白,特请教。
作者: 唐进    时间: 2012-10-24 20:27
当内存里面的引用类型被置为null时,它指向的内容将一直留着内存中,造成内存溢出的问题
作者: 刘丽娜    时间: 2012-10-24 21:24
1、静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。

2、内部类和外部类的引用容易出现内存泄露的问题

3、监听器的使用,java中往往会使用到监听器,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

4、大量临时变量的使用,没有及时将对象设置为null也可能导致内存的泄露

5、数据库的连接没有关闭情况,包括连接池方法连接数据库,如果没有关闭ResultSet等也都可能出现内存泄露的问题。

举例一个内存泄露的例子:

Vector v = new Vector(10);

for (int i = 1; i<100; i++){

    Object o = new Object();

    v.add(o);

    o = null;

}

别以为o对象被回收了,实际上v引用了这些对象,还被引用的对象GC是没有办法回收的,这样就很可能导致内存的泄露。


作者: 樊鹏飞    时间: 2012-10-24 21:41
你是指内存溢出吗?
  1. public class Test
  2. {
  3.         public static void main(String[] args){
  4.              int i = 3;
  5.              byte b = i;
  6.              System.out.println(b);
  7.         }
  8. }
复制代码
以上代码中将int类型的值赋额给了byte类型  而int类型占4个字节 byte类型占1个字节(可以简单理解为int类型的值大于byte类型的值)  编译的时候会报错:可能损失精度  即造成内存溢出
作者: 葬天    时间: 2012-10-24 21:43
判断 java内存泄露的两个条件
1,对象仍然被引用
2.这些对象是无用的,即程序以后不会再使用这些对象。
满足以上两个条件,
即可判定为存在内存泄漏,
这些对象不会被GC所回收,
然而它却占用内存。
作者: 黄邦荣    时间: 2012-10-25 01:13
由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序使用new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,所以内存泄露






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2