为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间;那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存。如果存在无用的内存没有被回收回来,那就是内存泄露。

对于Java程序而言,只要Java对象一直处于可达状态,垃圾回收机制就不会回收它们——即使它们对于程序来说已经变成了垃圾(程序再也不需要它们了);但对于垃圾回收机制来说,它们还不是垃圾(还处于可达状态),因此不能回收。

看ArrayList中remove(int index)方法的源代码,程序如下:

public E remove(int index)

{

//检查index索引是否越界

RangeCheck(index);

//使修改次数加1

modCount++;

//获取被删除的元素

E oldValue = (E)elementData[index];

int numMoved = size - index - 1;

//整体搬家

if (numMoved > 0)

System.arraycopy(elementData, index+1

, elementData, index, numMoved);

//将ArrayList的size减1,

//并将最后一个数组赋为null,让垃圾回收机制回收最后一个元素

elementData[--size] = null;

return oldValue;

}

上面程序中粗体字代码elementData[--size] = null;就是为了避免垃圾回收机制而书写的代码,如果没有这行代码,这个方法就会产生内存泄露——每删除一个对象,但该对象所占用的内存空间却不会释放。

Java中会存在内存泄漏吗,请简单描述?的更多相关文章

  1. java中会存在内存泄漏吗,请简单描述。

    内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中.Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以 ...

  2. 【Java面试题】52 java中会存在内存泄漏吗,请简单描述。

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

  3. Java中如何防止内存泄漏的发生

    在Java开发中我们常常会遇到内存泄漏的情况发生.那么为什么会发生内存泄漏,以及怎样去防止! 内存泄漏的定义:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 为什么会发生 ...

  4. java中存在的内存泄漏

    大家都知道JAVA有着自己的优点---垃圾回收器的机制,这个开发人员带来了很大的方便,不用我们编程人员去 控制内存回收等问题,有效的解决了内存泄露的问题,不至于导致系统因内存问题崩溃.为了精确的回收内 ...

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

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

  6. Java 中会存在内存泄漏吗,请简单描述?

    理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被 广泛使用于服务器端编程的一个重要原因):然而在实际开发中,可能会存在无 用但可达的对象,这些对象不能被 GC 回 ...

  7. Java:Java 中会存在内存泄漏吗

    理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因):然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致 ...

  8. Java中会存在内存泄露吗?请简单描述。

    本文转载自:Java中会存在内存泄漏吗,请简单描述 会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周 ...

  9. Android中常见的内存泄漏

    为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

随机推荐

  1. DDD与数据事务脚本

    DDD与数据事务脚本 扯淡 相信点进来看这篇文章的同学,大部分是因为标题里面的"DDD"所吸引!DDD并不是一个新技术,如果你百度一下它的历史就会知道,实际上它诞生于2004年, ...

  2. Clickhouse写入问题汇总

    Clickhouse写入问题汇总 Zookeeper相关 当clickhouse在建表时使用了Replicated引擎族时, 会对zookeeper有非常重的依赖, 这时候就要注意zookeeper集 ...

  3. 实例演示:Excel实现数据更新获取,并根据公式计算后展示

    ​ 我们数据库中有一些明细数据,希望我们可以使用Excel的公式,对报表数据进行,最后展示在自定义的行列固定报表中. 如下图:从左侧表中获取大类名称为饮料.海鲜.日用品,从2016/11/11到201 ...

  4. 只有PC端的报表工具使用太不方便了!有没有好用的手机报表app?

    马上到年底了,签订的销售合同需尽快回款,销售经理此时正在下午出差的出租车上,通过手中的手机他查看了一下今天的回款报表 项目已经进行到了关键期,项目经理正在奔赴项目城市的高铁列车上,项目今天的进度报表已 ...

  5. 磁盘管理及shell脚本编程练习

    转至:http://www.178linux.com/88405 1.创建一个10G分区,并格式为ext4文件系统 a) 要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂 ...

  6. Linux命令(ping-telnet-netstat-curl-ps)

    转至:https://www.jianshu.com/p/577bbd15a6f8 1.ping命令 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信 ...

  7. 利用logrotate工具对catalina.out进行日志分割实战

    logrotate是linux自带的日志分割工具,如果没有可以用yum安装 yum -y install logrotate 要配置日志分割定时任务,需要在/etc/logrotate.d/下创建一个 ...

  8. pip安装包失败的常见解决方法

    pip安装包失败的常见解决方法 方法一 当安装包失效的时候可以去网站下载whl文件.下载的时候应该先查看电脑上 python 的版本. 地址:https://www.lfd.uci.edu/~gohl ...

  9. LeetCode-061-旋转链表

    旋转链表 题目描述:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https://leet ...

  10. 【AI】AI学习方向

    df