前言:

内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。

本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。

什么是内存泄漏?

内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。

为了理解这个定义,我们需要了解对象在内存中的状态。下图说明了什么是未引用的,什么是引用的对象。

从图中可以看出,有被引用的对象和未被引用的对象。未引用的对象将被垃圾收集,而被引用的对象将不会被垃圾收集。未引用的对象肯定是未使用的,因为没有其他对象引用它。但是,未使用的对象并不是全部未被引用,其中一些被引用!这是内存泄漏的来源。

为什么内存泄漏发生?

让我们来看看下面的例子,看看为什么发生内存泄漏。在下面的例子中,对象A是指对象B。A的生命周期(t1 - t4)比B的(t2 - t3)长得多,当应用中不再使用B时,A仍然有一个B的引用,这样垃圾收集器就不能从内存中删除B。这就可能会导致内存不足的问题,因为如果A同时为更多的对象做同样的事情,那么会有很多像B这样的对象没有收集并占用内存空间。

B也可能拥有一堆其他对象的引用,B引用的对象也不会被收集。所有这些未使用的对象将消耗宝贵的内存空间。

如何防止内存泄漏?

以下是防止内存泄漏的一些快速实用技巧。

  • 注意集合类,如HashMap、ArrayList等,因为它们是发现内存泄漏的常见地方。当它们被声明为静态时,它们的生命时间与应用程序的生命时间是相同的。

  • 注意事件监听器和回调。如果一个侦听器被注册了,但是当类不再被使用时,可能会发生内存泄漏。

  • 如果一个类管理自己的内存,程序应该对内存泄漏保持警惕。通常情况下,指向其他对象的成员变量需要为null值。

我是小架!

以后会分享更多的内容的!

我们下篇文章见!

最新文章

  1. [No000042]CSS 之 平时那些你不敢用的字体
  2. 直接用<img> 的src属性显示base64转码后的字符串成图片
  3. 设置文件为源文件(和src一样)
  4. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
  5. Binder相关
  6. AJAX三种返回值方式
  7. 【转】python代码风格-PEP8
  8. ThinkPHP3.1快速入门(3)查询语言
  9. [学习笔记]设计模式之Prototype
  10. DoNet开源项目-基于Amaze UI的点餐系统
  11. linux进程间通信之信号
  12. Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
  13. iOS安全攻防之代码混淆
  14. STL - priority_queue(优先队列)
  15. Puppet部署Nginx返代示例
  16. A - 签到题
  17. vue中的组件
  18. tensorflow的variable的eval()和read_eval()有什么不同
  19. jode反编译软件
  20. Linux分区和挂载的理解

热门文章

  1. Flask请求和应用上下文源码分析
  2. linux (07) redis详解
  3. 201871010132--张潇潇--《面向对象程序设计(java)》第十二周学习总结
  4. selenium 简介 及浏览器配置
  5. 实现 Cloneable 需要注意
  6. 记一次排错经历,requests和fake_useragent
  7. [HNOI2002] Kathy 函数
  8. 洛谷 P1910 L国的战斗之间谍
  9. 前端Vue项目——登录页面实现
  10. mysql 字段修改汇总