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

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

目录

  • 一、导读
  • 二、概览
  • 三、相关知识
    • 3.1 内存泄露危害
    • 3.2 列举实际开发中遇到的内存泄露场景
    • 3.3 软引用 & 弱引用区别
  • 四、 推荐阅读

ddd

一、导读

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

二、概览

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

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

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

    if(JVM内存不足) {// 将软引用中的对象引用置为nullstr = null;// 通知垃圾回收器进行回收System.gc();}
  • 弱引用(WeakReference):发生GC就会回收
    一旦开始gc,只要发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存

  • 虚引用(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学习专栏

未经允许不得转载

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143327.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目-Spring Boot的生鲜网上交易系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

MongoDB基础详解

一、MongoDB概述 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一…

C. Card Game

题目:样例: 输入 4 4 -4 1 -3 5 4 1 -2 3 -4 3 -1 3 -5 1 -1输出 5 4 2 0 思路: 这里的题意就是, 当我们 i 取奇数的时候,可以获得该奇数 i 的值,并去掉当前卡牌。 当我们 i 取偶数的时候,去掉当…

Java基础简单整理

文章目录 Java语言具有以下特点:Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存?Java 和 C 的区别?Java注释用法:Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别?静态方法为…

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!)

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!) 前言 当今世界正处于云计算和大数据的快速发展阶段,而Storm作为一种高效、可靠的实时计算框架,受到了广泛的关注和应用。在这篇文章中&#xff0c…

【二】xxl-job 源码分析

xxl-job 源码分析 简介:阅读优秀的开源项目源码总是一件让人激动的事情,分布式调度平台xxl-job我们在生产环境也是有了很多的实践应用,一款产品使用久了对其实现原理多少有些了解了,今天也是抽出整块的时间来认真分析一下xxl-job的…

安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作

在玩机搞机过程中。有时候需要手动查看有些分区信息,或者备份分区的操作。那么今天以小米8为例解析下其中的操作步骤 机型:小米8 adb版本:https://developer.android.com/studio/releases/platform-tools 机型芯片:高通骁龙845…

三门问题-Swift测试

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Lets Make a Deal。问题名字来自该节目的主持人蒙提霍尔(Monty Hall)。 参赛者会看见三扇关闭了的门&#xf…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代,媒体行业一直在不断演变和创新,以适应观众的变化需求和技术的发展。而在这个进化的过程中,短视频应用TikTok已经崭露头角,成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

某高校的毕设

最近通过某个平台接的单子,最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面:推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

数据分析回头看2——重复值检查/元素替换/异常值筛选

0、前言: 这部分内容是对Pandas的回顾,同时也是对Pandas处理异常数据的一些技巧的总结,不一定全面,只是自己在数据处理当中遇到的问题进行的总结。 1、当数据中有重复行的时候需要检测重复行: 方法:使用p…

RabbitMQ工作模式——Routing路由模式

1.Routing路由模式 Routing生产者代码 public class Producer_Routing {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.…

Android T 禁止应用添加窗口的操作

序 什么情况下会出现我们需要禁止应用添加窗口的情况呢? 假如有一个应用的窗口,我们点开后是透明的或者会影响到系统的使用,那么我们就有必要对这个窗口操作一下 回顾我们在Android T WMS窗口相关流程中所讲的内容 禁止应用添加窗口的操作…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation (Paper reading) Konpat Preechakul, VISTEC, Thailand, CVPR22 Oral, Cited:117, Code, Paper 1. 前言 扩散概率模型 (DPM) 在图像生成方面取得了显着的质量,可与 GAN 相媲美。但是与…

引入嵌入和向量搜索时的三个错误

将非结构化数据表示为嵌入向量以及使用向量搜索进行基于嵌入的检索 (embedding-based retrieval - EBR) 比以往任何时候都更加流行。 嵌入到底是什么? Roy Keyes 在《嵌入的最短定义?》中对此进行了很好的解释。 嵌入是学习的转换,使数据更有…

React redux更新数据的诡异特征==》彻底掌握redux更新state机制的精髓

此文章是跟随我上一篇文章《Redux Toolkit中action派发但state值不更新的原因》写的。 本来一切都搞定了,此时我突发奇想: 如果让api服务端不发送包含x-pagination的header信息,web端会不会报错。因为按照web端 redux原有的逻辑:…

ubuntu与win之间共享文件夹

ubuntu上设置共享文件夹 第一步:点击【设置】或【虚拟机弹窗下面的【设置】选项】 第二步:进入【虚拟机设置】页面,点击【选项】如下图所示 第三步:启用共享文件:点击【总是启用】第四步:添加共享文件&…

【深度学习】RNN循环神经网络和LSTM深度学习模型

1. 循环神经网络 RNN( Recurrent Neural Network) 循环神经网络的一个核心是可以把前面的序列数据用到后面的结果预测里面。怎么样实现这一点呢。RNN 结构如下图所示。 前部序列的信息经处理后,作为输入信息传递到后部序列。 数学模型&…

机器学习第十三课--主成分分析PCA

一.高维数据 除了图片、文本数据,我们在实际工作中也会面临更多高维的数据。比如在评分卡模型构建过程中,我们通常会试着衍生出很多的特征,最后就得到上千维、甚至上完维特征;在广告点击率预测应用中,拥有几个亿特征也是常见的事…