浅析Java内存泄漏

       谈到内存泄漏,C/C++程序员是最有发言权的.

    因为 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.

    Java语言的一个优势就是它的内存管理机制,你只管创建对象.Java的垃圾回收器帮开发者分配及回收内存.然而,实际的情况并没有这么简单.在Java应用程序中,内存泄漏还是时常出现的.

        首先在Java中什么时候会发生内存泄漏呢

        如果一个对象被引用者,那么垃圾回收器就不会对它进行回收.那么我们假设一种简单的情况,在内存中有两个对象.它们一个的生命周期远大于另外一个的生命周期,而且生命周期大的对象有指向生存周期小的对象的引用,而且生存周期小的对象不再有指向其他对象的引用.那么这是GC就无法对生命周期小的那个对象进行回收.


一.那么什么是内存泄漏

对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着.

下图解释了什么是无用对象和未被引用对象.


从图中,有引用的对象和未被引用的对象。未被引用的对象将被垃圾收集,而被引用的对象将不会被垃圾收集。未被引用的对象肯定是未使用的,因为没有其他对象引用它。然而,未使用的对象并不都是未被引用的。有些是被引用的!这就是内存泄漏的来源。

扫描二维码关注公众号,回复: 1553356 查看本文章

二.为什么会发生内存泄漏

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

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


三.如何防止内存泄漏?

1.下面是一些关于防止内存泄漏的快速上手技巧。注意收集类,如HashMap、ArrayList等等,因为它们是发现内存泄漏的常见地方。当它们被声明为static时,它们的生命时间与应用程序的生命周期是相同的.

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

3.“如果一个类管理自己的内存,程序人员应该对内存泄漏保持警惕。”经常,指向其他对象的物体的成员变量需要被空出来.

4.初始化对象为NULL.

本文一半翻译一半自己的理解

原文英文地址:The Introduction of Java Memory Leaks

猜你喜欢

转载自blog.csdn.net/weixin_40099554/article/details/79895726