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.mzph.cn/news/89095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react ref获取dom节点

在React中,可以使用ref来获取DOM节点的引用。以下是一些示例代码,说明如何使用ref来获取DOM节点: 使用React.createRef()(React 16.3版本以及更高版本的推荐方法): import React, { Component } from react…

前后端分离的计算机毕设之基于springboot+vue的课程设计选题管理系统(内含源码+文档+教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)

0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程(有趣的灵魂,适合小白,不适合巨佬),从2023年3月19日开始,将会一直每天更新,准备在2024年5月1日之前更新…

Pikachu靶场——SSRF 服务端请求伪造

文章目录 1 SSRF 服务端请求伪造1.1 SSRF(curl)1.1.1 漏洞防御 1.2 SSRF(file_get_content)1.2.1 漏洞防御1.2.3 SSRF 防御 1 SSRF 服务端请求伪造 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&a…

孤网双机并联逆变器下垂控制策略MATLAB仿真模型

微❤关注“电气仔推送”获得资料 主体模块: 建议使用MATLAB2021b及以上版本打开! 功率计算模块、下垂控制模块、电压电流双环控制模块 系统输出有功功率: 系统输出无功功率: 系统频率变化曲线: 参考文献: 微电网并网运行模式下…

四川众佰诚:现在的抖音小店怎么注册

抖音小店是一种新的电子商务形式,它允许用户在抖音平台上直接销售商品。下面是一篇关于如何注册抖音小店的步骤说明: 下载并安装抖音App: 首先,你需要在手机上下载并安装最新版本的抖音App。你可以在苹果App Store或者安卓应用商店找到它。 创…

助力交叉学科应用型数据科学人才培养,和鲸科技携手华为发布联合解决方案

时代高速发展,智能化的浪潮奔腾而来,以“加速行业智能化”为主题,第八届华为全联接大会(HUAWEI CONNECT 2023)于 9 月 20 日正式开幕。本次大会中,华为携手生态伙伴引领智慧教育新风尚,和鲸科技…

【GIT】Git clone https://xxx.git 报错仓库找不到,ssh却可以。

环境 MacBook Pro:13.0 (22A380),Intel。 Python:3.10.9 序言 最近在Mac电脑中按照stable diffusion webUI 时,总是报: MacBook-Pro:openai yutao$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-…

​LeetCode解法汇总2582. 递枕头

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: n 个人站成…

Java中this关键字

在Java中,this 是一个关键字,代表当前对象的引用。它可以用于以下几个方面: 引用当前对象: 在实例方法中,this 代表当前对象的引用,可以使用它来访问当前对象的成员变量和方法。 public class MyClass {…

飞书与企业微信的异同

云文档 飞书的云文档会自动用游览器打开,不会直接在PC应用中打开(移动端能在应用中打开)。 飞书云文档能够插入视频、流程图、问卷等等 聊天消息交互 钉钉也有类似的功能,可以针对消息进行点赞等回复 钉钉的消息回复还有【收到…

第2讲:Vue开发环境的搭建及运行

Vue开发环境搭建步骤 1、安装node http://www.nodejs.com.cn/ 一般安装在根目录下,直接下一步下一步安装即可。如何检测安装完毕 node -v 2、第二步:安装vue-cli脚手架 npm install -g vue/cli ,查看安装版本 vue --version 3、第…

C# 委托和事件

C# 委托和事件 委托匿名方法事件 委托 当要把方法传送给其他方法时,需要使用委托。首先定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托代表了哪种类型的方法,然后创建该委托的一个或多个实例。编译器在后台将创建…

代码随想录 动态规划 Ⅹ

123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&…

C++常见设计模式

设计模式 设计模式的六大原则:https://zhuanlan.zhihu.com/p/110130347 适配器模式 假设Client想要一个正方形(client Interface),但是提供的服务(service)是个圆形,那么我就把这个圆通过适配…

java-decompiler

Java Decompiler GitHub F:\Document_JD-GUI\jd-gui-windows-1.4.0 jd-gui-windows-1.4.0 JDK 1.7 jd-gui-windows-1.6.6 JDK 1.8 Releases java-decompiler/jd-gui GitHub

flutter web 优化和flutter_admin_template

文章目录 Flutter Admin TemplateLive demo: https://githubityu.github.io/live_flutter_adminWeb 优化 Setup登录注册英文 亮色主题 中文 暗黑主题管理员登录权限 根据权限动态添加路由 第三方依赖License最后参考学习 Flutter Admin Template Responsive web with light/da…

【操作系统笔记十四】科普:POSIX 是什么

注:本文转载自该文章posix是什么都不知道,还好意思说你懂Linux? Linux开发者越来越多,但是仍然有很多人整不明白POSIX是什么。本文就带着大家来了解一下到底什么是POSIX,了解他的历史和重要性。 一、什么是 POSIX&…

虹科分享 | 网络保险:有效承保网络风险解决方案

文章来源:虹科网络安全 点击阅读原文:https://mp.weixin.qq.com/s/myCFPYtVVz5TPSFQaKqvLg 网络风险似乎往往很难量化,这使得保险公司很难适当地承保其网络风险政策。威胁载体的数量和不断发展的威胁,如新型恶意软件/勒索软件&…

220 - Othello (UVA)

题目链接如下: Online Judge 我最终的代码如下(有个细节,88行输出时,需要%2d;locate函数第三个参数是0的话,代表只是判断是否可以放置;1代表下一步棋,包括替换被夹住的棋子&#x…