zoukankan      html  css  js  c++  java
  • 简述Java内存泄露

    翻译人员: 铁锚
    翻译时间: 2013年11月4日
    原文链接: The Introduction of Memory Leaks

    内存管理一直是Java 所鼓吹的强大优点。开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放.但在很多情况下,事情并不那么简单,在 Java程序中总是会频繁地发生内存泄露(Memory Leaks).
    本文阐述什么是内存泄露,为什么会泄露,以及如何防止内存泄露。

    内存泄露是什么?
    内存泄露的定义: 当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放(Remove,移除)他们.
    用白话来说就是: 该回收的内存没被回收,最后因为内存不够用而导致程序报错。

    要理解这个定义,我们需要理解内存中的对象状态. 下图展示了什么是不使用的部分,以及未被引用的部分。


    图1

    从图中可以看出,内存中存在着 有引用的对象,和无引用的对象. 无引用的对象将被垃圾收集器所回收,而有引用的对象则不会被当做垃圾收集. 因为没有任何其他对象所引用,所以无引用对象一定是不再使用的。 但是有一部分无用对象仍然被(无意中)引用着。这就是发生内存泄露的根源.

    为什么内存会泄露?
    让我们看下面的实例来了解为什么内存会泄露. 在下面的情境中,对象A引用了对象B. A的生命周期(t1 - t4) 比 B的(t2 - t3)要长得多. 当对象B在应用程序逻辑中不会再被使用以后, 对象 A 仍然持有着 B的引用. (根据虚拟机规范)在这种情况下垃圾收集器不能将 B 从内存中释放. 这种情况很可能会引起内存问题,假若A 还持有着其他对象的引用,那么这些被引用的(无用)对象都不会被回收,并占用着内存空间.
    甚至有可能 B 也持有一大堆其他对象的引用。 这些对象由于被 B 所引用,也不会被垃圾收集器所回收. 所有这些无用的对象将消耗大量宝贵的内存空间。

    图2

    怎么防止内存泄露?
    要防止内存泄露,下面是一些快速上手的实用技巧:
    1. 当心集合类,比如 HashMap,ArrayList等,因为这是最容易发生内存泄露的地方.当集合对象被声明为static时,他们的生命周期一般和整个应用程序一样长。
    2. 注意事件监听和回调.当注册的监听器不再使用以后,如果没有被注销,那么很可能会发生内存泄露.
    3. "当一个类自己管理其内存空间时,程序员应该注意内存泄露." 常常是一个对象的成员变量需要被置为null 时仍然指向其他对象,

    一个小测验: 为什么 JDK6 中的 substring() 方法有可能导致内存泄露?
    要回答这个问题,请参考: JDK6和JDK7中String的substring()方法及其差异

    参考资料:
    [1] Bloch, Joshua. Effective java. Addison-Wesley Professional, 2008.
    [2] IBM Developer Work. http://www.ibm.com/developerworks/library/j-leaks/

    相关文章:
    1.  

    Java 对象在堆中的内存结构


    2.  Java 数组在内存中的结构
    3. How is an array stored in memory and brought to cache?
    4. Java String 常见问题

  • 相关阅读:
    [机器学习实战]K-近邻算法
    [机器学习Lesson3] 梯度下降算法
    [机器学习Lesson 2]代价函数之线性回归算法
    [机器学习Lesson 1] 机器学习简介
    Flume
    Kafka基础入门
    打造MacOS版“XShell”
    你好,智哥(摘自微信公众号“野兔故事会”)
    打印小册子
    php--strlen()与mb_strlen的作用与区别
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467087.html
Copyright © 2011-2022 走看看