Java内存泄漏介绍

作者: Java技术栈 | 来源:发表于2017-12-08 11:18 被阅读69次

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

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

    什么是内存泄漏?

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

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

    image

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

    为什么内存泄漏发生?

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

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

    image

    如何防止内存泄漏?

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

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

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

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

    思考

    为什么JDK 6中的substring方法会导致内存泄漏?

    推荐阅读


    分享一套高级视频教程:Dubbo+Zookeeper+ActiveMQ+Redis系列

    分享一套分布式架构设计高级视频教程

    分享一套Hadoop全套视频教程系列

    去BAT面试完的Mysql面试题总结(55道,带完整答案)

    阿里高级Java面试题(首发,70道,带详细答案)

    2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案

    Spring面试题(70道,史上最全)

    通往大神之路,百度Java面试题前200页。

    分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。


    相关文章

      网友评论

        本文标题:Java内存泄漏介绍

        本文链接:https://www.haomeiwen.com/subject/pznxvxtx.html