Java中会存在内存泄漏吗?

标签: GC Java 内存泄漏
4人阅读 评论(0) 收藏 举报
分类:

一般来说内存泄漏有两种情况。一种情况如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。

Java内存管理机制

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

上面是Java 内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。

Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC 就可以将其回收。反过来说,如果这个对象还存在引用,那么它将不会被 GC 回收,哪怕是 Java 虚拟机抛出 OutOfMemoryError 。

Java内存泄露
一般来说内存泄漏有两种情况。一种情况如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以, Java 中的内存泄漏,主要指的是第二种情况。
 
 可能光说概念太抽象了,大家可以看一下这样的例子:
[java] view plain copy
  1. Vector v = new  Vector( 10 );    
  2. for  ( int  i = 1 ;i < 100 ; i ++ ){    
  3.     Object o = new  Object();    
  4.     v.add(o);    
  5.     o = null ;    
  6. }   

在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。问题是当 o 引用被置空后,如果发生 GC ,我们创建的 Object 对象是否能够被 GC 回收呢?答案是否定的。因为, GC 在跟踪代码栈中的引用时,会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管 o 引用已经被置空,但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。如果在此循环之后, Object 对象对程序已经没有任何作用,那么我们就认为此 Java 程序发生了内存泄漏

[java] view plain copy
  1. System.out.println("vector.get(0)==="+vector.get(0));   

尽管对于C/C++ 中的内存泄露情况来说, Java 内存泄露导致的破坏性小,除了少数情况会出现程序崩溃的情况外,大多数情况下程序仍然能正常运行。但是,在移动设备对于内存和 CPU都有较严格的限制的情况下, Java 的内存溢出会导致程序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出 OutOfMemoryError ,导致程序崩溃。


java 的垃圾回收机制:

1.垃圾回收是由虚拟机自动执行,不能人为地干预。
       2.系统比较空闲(垃圾回收线程)
       3.对象不在被引用.对象处于引用的隔离岛状态(隔离引用),对象具备了回收的条件
       4.gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收。



注意到:hibernate的session中的对象属于持久态,垃圾回收器(gc)不会回收这些对象(无用但可达对象)!


博客转载于:https://blog.csdn.net/lovesomnus/article/details/40297667


查看评论

java中会存在内存泄漏吗,请简单描述?

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Jav...
  • coodlong
  • coodlong
  • 2016-03-09 16:46:10
  • 2039

java中会存在内存泄漏吗,请简单描述?

java中会存在内存泄漏吗,请简单描述。 .   会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命...
  • maguanghui_2012
  • maguanghui_2012
  • 2015-06-25 23:56:30
  • 1595

Java中会存在内存泄漏吗

Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即...
  • dreamsunday
  • dreamsunday
  • 2014-10-20 10:55:43
  • 8417

java 中会存在内存泄漏吗

会,存在无用但可达的对象,这些对象不能被GC 回收,导致耗费内存资源。    举个例子:    在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,    如果我...
  • sky_100
  • sky_100
  • 2016-09-13 19:39:11
  • 8175

Java语言中是否存在内存泄漏的问题

Java语言中是否存在内存泄漏的问题
  • jsqfengbao
  • jsqfengbao
  • 2015-03-31 22:26:21
  • 1169

Java中会存在内存泄露吗,请简单描述。

会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中...
  • xiaokang06
  • xiaokang06
  • 2012-07-30 16:06:37
  • 1001

轻松搞定JAVA面试之Java 中会存在内存泄漏吗

在魔都奋斗的程序员GG 2017-05-06 13:33 前言--大家好,很快又到周末了,周末对于我们这种IT宅男来说,就是宅着陪电脑,所以今天继续为大家带来一篇JAVA面试文章,希望大家多多转发...
  • u011277123
  • u011277123
  • 2017-05-08 15:01:53
  • 457

java基础问题----java中会存在内存泄漏吗,请简单描述

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Jav...
  • zhyooo123
  • zhyooo123
  • 2011-08-18 10:45:55
  • 628

java中会存在内存泄漏吗

会。如:int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。...
  • dfg0823
  • dfg0823
  • 2014-05-29 17:05:00
  • 221

java中会存在内存泄漏吗?

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Jav...
  • lixiaoming000
  • lixiaoming000
  • 2013-10-21 19:58:01
  • 432
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 8万+
    积分: 3265
    排名: 1万+
    博客专栏
    最新评论