搜索

首页  >  问答  >  正文

既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢

既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢

伊谢尔伦伊谢尔伦2806 天前837

全部回复(10)我来回复

  • PHP中文网

    PHP中文网2017-04-18 10:51:43

    内存资源是有限的,垃圾回收只回收“垃圾”,对于你的程序运行有用的对象不会被回收。

    回复
    0
  • 高洛峰

    高洛峰2017-04-18 10:51:43

    内存溢出分两种情况:一种是栈溢出,比如调用了一个无限递归。还有一种是堆溢出,即new 出来的对象没有即使销毁,比如一直new。

    回复
    0
  • 黄舟

    黄舟2017-04-18 10:51:43

    因为有些写的很蠢的程序会在GC机制生效之前无限地创建对象。

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:51:43

    一般来说,Java中的内存泄漏指的是已经不再被程序需要的已分配内存无法被回收。
    垃圾回收机制通过对象与Root对象的可达性判断内存是否可以被回收,但由于编程错误或其他原因,导致过期的对象引用仍然被持有,垃圾回收器无法回收相关空间。

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:43

    占着茅坑不拉屎,他也没办法.
    推荐看下我同事写的博客:http://blog.csdn.net/zhanggan...

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:51:43

    一些对象其实不需要了但却一直被引用,没办法回收

    回复
    0
  • PHPz

    PHPz2017-04-18 10:51:43

    就目前来说,人做的东西还不能超越人本身,java的GC算法是人写出来的,奈何就有人会作死写出让GC无法回收的代码来

    回复
    0
  • 高洛峰

    高洛峰2017-04-18 10:51:43

    这就如同中国那么大,为什么还有人在朝阳区懵逼一样。

    回复
    0
  • PHPz

    PHPz2017-04-18 10:51:43

    我自己的理解,说的不对的地方欢迎指正。
    JDK6中,String的一个方法叫subString,这个是用来生成一个子字符串的。为了更加快速的生成,String有一个构造函数,
    String(int offset, int count, char value[]) {

    this.value = value;
    this.offset = offset;
    this.count = count;

    }
    直接指向了原来String的数组。我们都知道,每次都会生成一个新的常量池中的String字符串。然而这个引用就导致了原来的String无法被回收。因为subString的value会指向他。这里就会导致内存泄露。

    JVM的确是自己进行GC的,不用程序员过多干涉,但是由于一些错误操作,导致一些本来不在需要使用的对象仍然有引用,才会导致内存泄露的。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:51:43

    JVM:程序员抓着垃圾不放,我也很为难啊。

    回复
    0
  • 取消回复