摘要:本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。但是,未使用的对象并不是全部未被引用,其中一些被引用这是内存泄漏的来源。注意集合类,如等,因为它们是发现内存泄漏的常见地方。如果一个类管理自己的内存,程序应该对内存泄漏保持警惕。
内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。
本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。
什么是内存泄漏?
内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。
为了理解这个定义,我们需要了解对象在内存中的状态。下图说明了什么是未引用的,什么是引用的对象。
从图中可以看出,有被引用的对象和未被引用的对象。未引用的对象将被垃圾收集,而被引用的对象将不会被垃圾收集。未引用的对象肯定是未使用的,因为没有其他对象引用它。但是,未使用的对象并不是全部未被引用,其中一些被引用!这是内存泄漏的来源。
为什么内存泄漏发生?
让我们来看看下面的例子,看看为什么发生内存泄漏。在下面的例子中,对象A是指对象B。A的生命周期(t1 - t4)比B的(t2 - t3)长得多,当应用中不再使用B时,A仍然有一个B的引用,这样垃圾收集器就不能从内存中删除B。这就可能会导致内存不足的问题,因为如果A同时为更多的对象做同样的事情,那么会有很多像B这样的对象没有收集并占用内存空间。
B也可能拥有一堆其他对象的引用,B引用的对象也不会被收集。所有这些未使用的对象将消耗宝贵的内存空间。
如何防止内存泄漏?
以下是防止内存泄漏的一些快速实用技巧。
注意集合类,如HashMap、ArrayList等,因为它们是发现内存泄漏的常见地方。当它们被声明为静态时,它们的生命时间与应用程序的生命时间是相同的。
注意事件监听器和回调。如果一个侦听器被注册了,但是当类不再被使用时,可能会发生内存泄漏。
如果一个类管理自己的内存,程序应该对内存泄漏保持警惕。通常情况下,指向其他对象的成员变量需要为null值。
思考
为什么JDK 6中的substring方法会导致内存泄漏?
推荐阅读
去BAT面试完的Mysql面试题总结(55道,带完整答案)
阿里高级Java面试题(首发,70道,带详细答案)
2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案
Spring面试题(70道,史上最全)
通往大神之路,百度Java面试题前200页。
分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71381.html
摘要:然而,中依然有可能发生内存泄漏。所以你的安卓快速定位解决内存泄漏掘金昨天是个好日子,程序员的节日,在这里给所有的程序员送上一份迟到的祝福。应用内存泄漏的定位分析与解决策略掘金,大家好,我是。 Android 性能优化之巧用软引用与弱引用优化内存使用 - Android - 掘金前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱...
摘要:如果这个静态变量在生命周期结束后没有清空,就导致内存泄漏。因此造成内存泄露。注册没取消造成的内存泄露这种的内存泄露比纯的内存泄漏还要严重,因为其他一些程序可能引用系统的程序的对象比如注册机制。 原文链接 更多教程 为什么会发生内存泄漏 内存空间使用完毕之后未回收, 会导致内存泄漏。有人会问:Java不是有垃圾自动回收机制么?不幸的是,在Java中仍存在很多容易导致内存泄漏的逻辑(...
阅读 1416·2021-11-17 09:33
阅读 1237·2021-10-11 10:59
阅读 2866·2021-09-30 09:48
阅读 1877·2021-09-30 09:47
阅读 2965·2019-08-30 15:55
阅读 2296·2019-08-30 15:54
阅读 1463·2019-08-29 15:25
阅读 1619·2019-08-29 10:57