A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲁中需 中级黑马   /  2012-10-24 20:07  /  1462 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 鲁中需 于 2012-10-25 21:58 编辑

初学java时,有书上说java中有垃圾回收机制,它可以保证一对象不再被引用的时候被垃圾回收装置自动回收,不必担心内存泄露问题,可随着学习的深入,并不是这么回事,java也有内存泄露问题,可具体原理不是太明白,特请教。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

5 个回复

倒序浏览
当内存里面的引用类型被置为null时,它指向的内容将一直留着内存中,造成内存溢出的问题
回复 使用道具 举报
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是没有办法回收的,这样就很可能导致内存的泄露。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
你是指内存溢出吗?
  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类型的值)  编译的时候会报错:可能损失精度  即造成内存溢出
回复 使用道具 举报
判断 java内存泄露的两个条件
1,对象仍然被引用
2.这些对象是无用的,即程序以后不会再使用这些对象。
满足以上两个条件,
即可判定为存在内存泄漏,
这些对象不会被GC所回收,
然而它却占用内存。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

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

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马