浅析Java中的内存泄漏

作者:goldensun 时间:2023-12-19 02:29:02 

ava最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。

本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。

什么是内存泄漏?

定义:如果对象在应用中不再被使用,但由于它们在其他地方被引用,垃圾回收却不能移除它们(这样就造成了很多内存不能释放,从而导致内存溢出的现象。译注)。


要理解这一定义,我们需要理解内存中对象的状态。下图说明了那些是未使用,那些是未引用。

浅析Java中的内存泄漏

 从图中可以看到被引用对象和未引用对象(的范围)。未引用对象可以被垃圾回收机制回收,而被引用对象不能被垃圾回收机制回收。未引用对象当然是没有使用的,因为没有其他对象引用了它。然而未使用对象并不都是未引用的。某些未使用的对象仍然被其他地方引用!这就是内存泄漏起因。


为什么会发生内存泄漏?

让我们来下面的这个例子,看看为什么会发生内存泄漏。在如下例子中,A对象引用了B对象。A的生命周期(t1-t4)比B的生命周期(t2-t3)要长的多,当B不再在应用中被使用,A仍然持有对B的引用。这样一来,垃圾回收机制不能从内存中移除B。这很有可能导致内存溢出问题,因为如果其他很多对象像A一样,那么内存中将会有很多不能被回收的对象,这将消耗大量内存空间。
也有可能的情况是B持有了大量对其他对象的引用。这些被B引用的对象同样不会被回收掉。所有这些未使用的对象将会消耗宝贵的内存空间。

浅析Java中的内存泄漏

 如何预防内存泄漏?

如下是一些预防内存泄漏的快速技巧:

1、留意集合类,比如HashMap,ArrayList等等,因为他们是内存泄漏经常发生的地方。当它们被声明为静态对象时,他们的生命周期就和应用的生命周期一样长。

2、留意事件 * 和回调。如果一个类注册了 * ,但当该类不再被使用后没有注销 * ,可能会发生内存泄漏。

3、“如果一个类管理自己的内存,程序员应该警惕内存泄漏。”[1],很多时候对象中的指向其他对象成员变量需要设置成null(才能被回收)。

标签:Java,内存泄漏
0
投稿

猜你喜欢

  • java中javamail发送带附件的邮件实现方法

    2023-12-06 02:46:30
  • java中类与对象的使用详情

    2023-09-27 17:10:43
  • C#类中static变量用法分析

    2022-06-20 16:14:23
  • 解决Javaweb 提交表单到servlet时出现空白页面,但网站不报错问题

    2021-06-21 20:26:48
  • C#实现Word和ODT文档相互转换详解

    2022-12-17 21:36:47
  • java.lang.ExceptionInInitializerError异常的解决方法

    2023-01-13 04:23:16
  • Android中Matrix用法实例分析

    2023-07-07 18:40:22
  • Android程序开发之手机APP创建桌面快捷方式

    2023-04-01 06:55:49
  • Android 自定义密码输入框实现代码

    2023-02-11 09:18:40
  • 散列表的原理与Java实现方法详解

    2023-06-06 06:46:29
  • 详解Mybatis多参数传递入参四种处理方式

    2022-12-27 15:18:20
  • SpringBoot+EasyPoi实现excel导出功能

    2022-05-08 06:47:35
  • Java 比较接口comparable与comparator区别解析

    2022-11-26 20:54:24
  • 微信公众号服务号推送模板消息设置方法(后端java)

    2023-11-20 08:27:58
  • c#使用S22.Imap收剑灵激活码邮件代码示例(imap收邮件)

    2022-11-27 20:59:37
  • java使用Hashtable过滤数组中重复值的方法

    2023-10-22 06:24:08
  • Spring Security中的Servlet过滤器体系代码分析

    2023-03-23 19:05:34
  • SpringCloud Eureka服务注册中心应用入门详解

    2022-02-23 08:48:44
  • Java中常用缓存Cache机制的实现

    2023-05-27 23:32:22
  • 使用工具类-java精确到小数点后6位

    2021-06-24 20:45:39
  • asp之家 软件编程 m.aspxhome.com