iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java内存泄漏知识(软引用、弱引用等)
  • 372
分享到

Java内存泄漏知识(软引用、弱引用等)

java内存泄漏弱引用强引用android 2023-10-22 11:10:47 372人浏览 独家记忆
摘要

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端移动开发、商业变现、人工智能等,希望大家多多支持。
未经允许不得转载

目录

ddd

一、导读

我们继续总结学习Java基础知识,温故知新。

二、概览

要学习内存泄漏,我们要知道一些基础知识,如Java引用分类:

2.1 强引用

平时常用的引用类型,JVM发生OOM也不会回收这部分引用。
如果强引用对象不使用时,需要弱化从而使GC能够回收,如 object = null;

2.2 软引用(SoftReference)

发生OOM前(jvm内存不足时)会回收这部分引用,如果想使用缓存,可以使用 LruCache,而不是SoftReference
如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;
如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

    if(JVM内存不足) {        // 将软引用中的对象引用置为null        str = null;        // 通知垃圾回收器进行回收        System.gc();    }

2.3 弱引用(WeakReference)

发生GC就会回收
一旦开始gc,只要发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存

我们一起来看看构造方法

public WeakReference(T referent) {    super(referent);}public WeakReference(T referent, ReferenceQueue<? super T> q) {    super(referent, q);}

假设我们以后对象存储在一个列表,比如HashMap中,我们想要真正的回收一个对象,仅仅把它的强引用赋值为null是不够的,还要把相应的条目从HashMap中移除。

2.4 虚引用(PhantomReference)

get方法返回null,不能获取值。

在这里插入图片描述

三、相关知识

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。

3.1 内存泄露危害

  • 当应用程序长时间连续运行时,性能严重下降;
  • 抛出OutOfMemoryError异常;
  • 程序莫名其妙的自动崩溃;
  • 应用程序耗尽链接对象。
  • 等等

3.2 列举实际开发中遇到的内存泄露场景

  • 非静态内部类的静态实例

  • 单例造成的内存泄漏
    如果一个对象已经不再需要使用了,而单例对象还持有该对象的引用,就会使得该对象不能被正常回收,从而导致了内存泄漏。

  • 非静态内部类创建静态实例造成的内存泄漏
    eg: Handler造成的内存泄漏
    原因:在类中将 Handler 声明成非静态内部类或者匿名内部类,这样Handle默认持有外部类Activity的引用,如果Activity在销毁时,
    Handler还有未执行完或者正在执行的Message,而Handler又持有Activity的引用,导致GC无法回收Activity,导致内存泄漏

解决方法: 将Handler类独立出来或者使用静态内部类 + 弱引用,这样便可以避免内存泄漏。 内部类改为静态的之后,
它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用

问题:内部类为什么会持有外部类的引用

内部类虽然和外部类写在同一个文件中,但是编译后还是会生成不同的class文件,其中内部类的构造函数中会传入外部类的实例,内部类持有外部类的对象的引用,是以“this$0”这个字段来保存的

Java 语言中,非静态内部类的主要作用有两个:

1. 当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。2. 当内部类持有外部类时,它就可以直接使用外部类中的变量了,这样可以很方便的完成调用,
  • 线程造成的内存泄漏
    ThreadLocal 造成的内存泄漏,ThreadLocal会复制变量副本,

解决方法: 将AsyncTask和Runnable类独立出来或者使用静态内部类,这样便可以避免内存泄漏。

匿名内部类/非静态内部类和异步线程。

  • 资源未关闭造成的内存泄漏
    对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。 资源型对象未关闭: Cursor,File

  • 类的静态变量持有大数据对象(static 字段)

  • 集合容器中的对象没清理造成的内存泄漏

  • finalize()
    重写finalize()方法时,该类的对象不会立即被垃圾收集器收集,如果finalize()方法的代码有问题,那么会潜在的引发OOM;

  • 注册对象未销毁: 广播,回调监听

  • WEBView: 使用单独进程

3.3 软引用 & 弱引用区别

  • 弱引用的对象拥有更短暂的生命周期
  • 回收的时机不同

四、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

未经允许不得转载

在这里插入图片描述

来源地址:https://blog.csdn.net/fumeidonga/article/details/132214403

--结束END--

本文标题: Java内存泄漏知识(软引用、弱引用等)

本文链接: https://www.lsjlt.com/news/439726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java内存泄漏知识(软引用、弱引用等)
    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 ...
    99+
    2023-10-22
    java 内存泄漏 弱引用 强引用 android
  • Java中怎么用弱引用堵住内存泄漏
    本篇内容主要讲解“Java中怎么用弱引用堵住内存泄漏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中怎么用弱引用堵住内存泄漏”吧!虽然用 Java™ 语言编写的程序在理论上是不会出现“内...
    99+
    2023-06-03
  • 对ThreadLocal内存泄漏及弱引用的理解
    ThreadLocal内存泄漏及弱引用 1.什么是内存泄漏?Entry的key弱引用与泄漏关系 在TreadLocal中内存泄漏是指TreadLocalMap中的Entry中的ke...
    99+
    2024-04-02
  • Java中怎么引入内存泄漏
    Java中怎么引入内存泄漏,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 什么是内存泄漏内存泄漏的定义:应用程序不再使用对象,但是垃圾收集器不能删除它们,因为它们正在被引用...
    99+
    2023-06-16
  • Java中的强引用,软引用,弱引用,虚引用的作用介绍
    目录1.强引用( Strong Reference )2.软引用( Soft Reference )3.弱引用( Weak Reference )4.虚引用( PhantomRefe...
    99+
    2024-04-02
  • java中弱引用和软引用有什么区别
    java中弱引用和软引用有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的...
    99+
    2023-06-14
  • 如何使用javascript识别内存泄漏
    今天就跟大家聊聊有关如何使用javascript识别内存泄漏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、浏览器方法如果内存占用基本平稳,接近水平,就说明不存在内存泄漏。反之,就...
    99+
    2023-06-15
  • 解决NSTimer循环引用导致内存泄漏的六种方法
    解决NSTimer循环引用导致内存泄漏的六种方法如下:1. 使用weak引用:在创建NSTimer时使用weak引用来引用目标对象,...
    99+
    2023-09-20
    NSTimer
  • 如何用Java编写一段代码引发内存泄露
    今天就跟大家聊聊有关如何用Java编写一段代码引发内存泄露,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码。这个问题...
    99+
    2023-06-17
  • Java中的引用知识点总结
    本篇内容介绍了“Java中的引用知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!强引用:默认情况下,对象采用的均为强引用(这个对象的...
    99+
    2023-06-05
  • Java基础之引用相关知识总结
    目录一、引用的定义二、问题三、引用的分类四、应用场景五、源码六、总结一、引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的...
    99+
    2024-04-02
  • Java应用程序中内存泄漏及内存管理的示例分析
    这篇文章主要介绍Java应用程序中内存泄漏及内存管理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!btw,一些静态代码扫描工具也能检测出不好的编程习惯带来潜在的内存泄露的风险。Java平台的一个突出的特性是...
    99+
    2023-06-02
  • c++循环引用导致的内存泄露如何解决
    在 C++ 中,循环引用(circular reference)是指两个或多个对象相互引用,导致内存泄漏的情况。解决循环引用导致的内...
    99+
    2023-10-10
    c++
  • java使用软引用实现缓存机制示例
    目录正文软引用和强引用项目使用idea创建一个maven项目首先对Good实体类进行编写。然后我们在goodbase里面编写代码,模拟一个数据库然后书写goodscache缓存类go...
    99+
    2022-11-13
    java软引用缓存机制 java软引用
  • 教你用MAT工具分析Java堆内存泄漏问题的解决方法
    一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以...
    99+
    2024-04-02
  • 如何解析Java对象引用与JVM自动内存管理
    今天就跟大家聊聊有关如何解析Java对象引用与JVM自动内存管理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。解析Java对象引用与JVM自动内存管理(转)[@more@]对象引用应...
    99+
    2023-06-03
  • java 引用类型的数据传递的是内存地址实例
    目录java 引用类型的数据传递的是内存地址看下面的代码和截图list集合存引用数据类型时的问题集合list的存储元素java 引用类型的数据传递的是内存地址 java中引用类型的数...
    99+
    2024-04-02
  • Java即将引入新对象类型来解决内存使用问题
    目录一、Valhalla二、Java类型系统的不足三、对象头四、Value Class前言: 2022年Java将有什么新的特性和改进,我相信很多Java开发者都想知道。结合Java...
    99+
    2024-04-02
  • 索引和缓存在 Java 中的作用是什么?考虑到面试可能会涉及到这些知识点。
    索引和缓存在 Java 中的作用是什么?考虑到面试可能会涉及到这些知识点。 Java 中的索引和缓存是两个非常重要的概念,它们在提高程序性能和减少资源消耗方面起着至关重要的作用。在这篇文章中,我们将深入探讨索引和缓存在 Java 中的作用,...
    99+
    2023-10-29
    索引 缓存 面试
  • Java 框架中的 Path 索引:你需要知道的所有关于优化你的应用程序的知识。
    Java 是一种广泛使用的编程语言,它提供了丰富的编程框架,以便开发人员可以更快速地开发高质量的应用程序。其中,Path 索引是一个非常重要的概念,在 Java 应用程序的性能优化中扮演着关键的角色。在本文中,我们将探讨 Path 索引的概...
    99+
    2023-06-26
    框架 path 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作