关于Java内存泄漏的一些见解

java内存泄漏

分析

  • Java本身自带GC垃圾回收器,内存的分配是由自主程序完成的,而内存的释放就是由垃圾收集器管理的。GC垃圾回收器的原理就是在遍历程序时,如果发现被引用的孤立对象或者对象的引用,赋值或被引用时下面代码没有引用到,这时就会被GC垃圾回收器释放,不然会占据内存。

  • 而内存泄露是指创建的对象,在堆栈中存在,却在程序中不被使用,造成内存占用,导致泄露。
    java在new对象时其内存空间会在堆中分配一定的空间,在栈中存储相应数据,两者存在引用关系。说到这那么首先得理解什么是引用,什么是对象。上代码(今天刚用过的)

    在这里插入图片描述

结论

  • 在java中我们是通过引用来操作对象的。比如上面代码中: Object o = new Object();
    o是引用,根据o能找到新创建的Object()对象,但是o并不是这个对象。如果忽略第9行以后的代码,oa[0] =
    o;说明通过oa[0]数组在内部的堆栈信息还能找到对象,那么这个对象就不是垃圾 ,这就造成了内存泄漏。
    那么看到10,11行时,就能想到一个防止内存泄漏的方法,对,就是让他们等于空值,这样new的Float()对象就不存在了,处于孤立状态,自然会被GC所处理。

  • 当然还有许多类型的内存泄露,自己现知道的只有这一种,以下几个情况先写上(查看别人博客),待后续摸清楚再详细补充。

  • 1.静态集合类引起内存泄漏:像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。

  • 2.监听器:在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。

  • 3.内部类和外部模块的引用:内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。此外程序员还要小心外部模块不经意的引用。

  • 4.单例模式:不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏

  • 转自 https://blog.csdn.net/qq_44941119/article/details/97008877?tdsourcetag=s_pcqq_aiomsg

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值