为了搞清楚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;就是为了避免垃圾回收机制而书写的代码,如果没有这行代码,这个方法就会产生内存泄露——每删除一个对象,但该对象所占用的内存空间却不会释放。

最新文章

  1. background-image和img的区别
  2. Elasticsearch相关资源
  3. android ListView嵌套GridView显示不全问题
  4. jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
  5. Android中Service的使用
  6. WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)
  7. HBase(八): 表结构设计优化
  8. HDOJ 1422 重温世界杯 -- 动态规划
  9. Android二维码扫描、生成
  10. JDK常用命令行工具(基于JDK10)
  11. Hexo 搭建博客 本地运行 常见报错及解决办法
  12. JavaScript基础二
  13. Android热门网络框架Volley详解[申明:来源于网络]
  14. Python 模块管理1
  15. 10 Maven 版本管理
  16. Centos 6.5 python 2.6.6 升级到 2.7
  17. HashMap中的equals和hashCode
  18. 数据分析处理库Pandas——常用操作
  19. LeetCode-11-6
  20. 集训Day8

热门文章

  1. Prometheus之Dockerfile编写、镜像构建、容器启动
  2. 「BUAA OO Pre」 Pre 2总结回顾概览
  3. 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板
  4. windows痕迹清理的基本思路和思考逻辑
  5. 用Stegsolve工具解图片隐写的问题
  6. Linux 网络时间同步
  7. 【windows 访问控制】十一、C# 实操 对象 System.Security.AccessControl 命名空间
  8. Qt:QMutex
  9. 控制台console不打印信息的解决办法
  10. c/c++(c++和网络编程)日常积累(二)