什么时候会发生内存泄漏?

1. 内存泄漏是什么?

定义:内存泄漏是指程序中的对象已经不再需要,但由于被其他对象错误引用,导致垃圾回收器(GC)无法回收它,从而长期占用内存空间的现象。


2. 内存泄漏的危害

问题具体表现
内存持续增长应用占用内存越来越大
卡顿与ANR频繁GC导致界面卡顿,操作无响应
OOM崩溃内存耗尽导致应用崩溃
系统资源抢占系统优先回收高内存应用,增加被杀风险

Java内存核心机制

  • GC工作原理:从GC Roots(如静态变量、活动线程)出发,标记所有可达对象,回收不可达对象


3. 工作中常见内存泄漏场景及解决方案

场景1:单例持有Activity引用

错误代码

public class AppManager {private static AppManager instance;private Context context; // 危险!可能持有Activityprivate AppManager(Context context) {this.context = context; // 直接使用Activity Context}
}

问题:单例生命周期=应用生命周期,若持有Activity,会导致Activity无法回收。

解决方案

this.context = context.getApplicationContext(); // 使用Application Context
场景2:非静态内部类的静态实例

错误代码

public class MainActivity extends AppCompatActivity {private static Resource resource; // 静态变量void init() {resource = new Resource(); // 非静态内部类实例}class Resource { // 非静态内部类// 隐含持有外部类MainActivity的引用!}
}

问题:静态变量resource生命周期=应用生命周期,其持有的Resource实例隐式持有Activity引用。

解决方案

static class Resource { // 改为静态内部类// 不再持有外部类引用
}
场景3:Handler内存泄漏

错误代码

public class MainActivity extends AppCompatActivity {private final Handler handler = new Handler() { // 匿名内部类@Overridepublic void handleMessage(Message msg) {// 隐式持有Activity引用}};
}

泄漏链

MessageQueue → Message → Handler → Activity

解决方案

// 1. 静态内部类 + 弱引用
private static class SafeHandler extends Handler {private final WeakReference<Activity> weakActivity;SafeHandler(Activity activity) {weakActivity = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {Activity activity = weakActivity.get();if (activity == null) return; // Activity已销毁// 处理消息...}
}// 2. 在onDestroy中移除消息
@Override
protected void onDestroy() {super.onDestroy();handler.removeCallbacksAndMessages(null);
}
场景4:WebView内存泄漏

问题:WebView即使调用destroy()也可能泄漏(尤其Android 5.1以下)

解决方案

// 方式1:动态创建+移除
FrameLayout container = findViewById(R.id.web_container);
webView = new WebView(getApplicationContext()); // 使用Application Context
container.addView(webView);@Override
protected void onDestroy() {container.removeView(webView);webView.destroy();super.onDestroy();
}// 方式2:独立进程(在AndroidManifest.xml中配置)
<activity android:name=".WebActivity" android:process=":web"/>
// 退出时
finish();
System.exit(0);
场景5:资源未关闭

常见泄漏点

// 忘记关闭导致泄漏
Cursor cursor = db.query(...);
InputStream is = getAssets().open(...);
BroadcastReceiver receiver = new MyReceiver();

解决方案

@Override
protected void onDestroy() {super.onDestroy();cursor.close();     // 关闭数据库游标is.close();         // 关闭文件流unregisterReceiver(receiver); // 注销广播
}
其他高频泄漏点
场景解决方案
EventBus未反注册EventBus.getDefault().unregister(this)
集合对象未清理定期清理无用引用 list.clear()
动画未取消animator.cancel()

总结

"内存泄漏本质是无用对象无法被回收。工作中我重点关注五大场景:
1. 单例误用:避免持有Activity,改用Application Context
2. 内部类泄漏:将非静态内部类改为static,或使用弱引用
3. Handler泄漏:采用静态Handler+弱引用,并在onDestroy移除消息
4. WebView泄漏:动态创建+及时移除,或使用独立进程
5. 资源未关闭:在onDestroy中释放Cursor/文件流/广播等
通过LeakCanary检测+代码规范,可有效预防内存泄漏问题。"

检测工具

  • LeakCanary(自动检测)

  • Android Profiler(手动分析)


补充

1. GC Roots对象有哪些?(可作为垃圾回收起点)
GC Root类型代码示例
虚拟机栈中的引用void foo() { Object obj = new Object(); }obj是GC Root)
方法区静态属性引用public static Object staticObj;
方法区常量引用public static final Object CONSTANT = new Object();
本地方法栈JNI引用JNI调用的Native对象
同步锁持有对象synchronized(lockObj) { ... }
2. 内存区域存储内容
区域存储内容生命周期
栈区基本类型(intboolean等)、对象引用(地址)方法结束即释放
堆区对象实例(new创建的对象)、数组由GC管理回收
方法区类信息、静态变量(static)、常量池(final程序运行期间不释放

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

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

相关文章

用RSA算法模拟类的适配器模式

“RAS算法”这个术语本身并不常见或标准&#xff0c;它可能指向两个主要领域的不同概念&#xff0c;具体取决于上下文&#xff1a; 更可能是拼写错误&#xff1a;指 RSA 算法&#xff08;密码学&#xff09; 这是最常见的情况。 “RAS” 极有可能是 “RSA” 的拼写错误。RSA 算…

CARSIM-与C#自动化测试方案

using System; using System.Runtime.InteropServices; using System.Collections.Generic;namespace CarSimAutomation {/// <summary>/// CarSim COM 自动化测试接口/// 封装所有 CarSim COM 功能用于自动化测试/// </summary>[ComVisible(true)][ClassInterface…

企微CRM系统中的任务分配与效率提升技巧

在数字化管理时代&#xff0c;企业微信(企微)与CRM系统的深度融合&#xff0c;为企业提供了更高效的客户管理与团队协作方案。企微CRM软件不仅整合了客户沟通、销售跟进、数据分析等功能&#xff0c;还能通过智能任务分配优化团队效率。本文将深入探讨企微CRM管理系统的任务分配…

day66—BFS—最短的桥(LeetCode-934)

题目描述 给你一个大小为 n x n 的二元矩阵 grid &#xff0c;其中 1 表示陆地&#xff0c;0 表示水域。 岛 是由四面相连的 1 形成的一个最大组&#xff0c;即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#xff0c;以使两座…

FramePack 安装指南(中文)

FramePack 安装指南&#xff08;中文&#xff09; -Windows FramePack 是最前沿的 AI 视频生成框架&#xff0c;以极小的硬件需求颠覆视频创作&#xff01;它能在仅 6GB 笔记本 GPU 内存上&#xff0c;驱动 13B 模型以 30 FPS 生成超长 120 秒视频&#xff0c;几乎无内容限制&…

Redis Sentinel 非集群模式高可用部署指南

1. Sentinel 在非集群模式的定位 一句话&#xff1a;在单主多从架构中&#xff0c;用 Sentinel 替你盯哨——探测故障、选举新主、通知客户端。 核心四职能&#xff1a; 职能作用点Monitoring定时 PING 主从&#xff0c;自身也互相探测Notification通过日志/PubSub/外部调用报…

2025Java面试八股文

文章目录 Java基础JVM多线程SpringSpring Boot数据库与SQL分布式系统其他 Java基础 自动装箱与拆箱&#xff1a;Java中基础数据类型与包装类之间的转换。例如&#xff0c;Integer x 1; 是装箱&#xff0c;int y x; 是拆箱。Object类常用方法&#xff1a;如clone()、getClass…

宝塔安装nginx-rtmp,音视频直播

前置&#xff1a;需要自己开发音视频直播&#xff0c; 注意不是实时音视频&#xff0c;不是一对一视频聊天&#xff0c;不是视频会议 方案有 srs &#xff0c;nginx-rtmp&#xff0c;live555&#xff0c;node-media-server&#xff0c;EasyDarwin等 今天是说 nginx-rtmp 怎么…

基于微信小程序和深度学习的宠物照片拍摄指导平台的设计与实现

文章目录 摘要前言绪论1. 课题背景2. 国内外现状与趋势2.1 国内研究现状2.2 国外研究现状2.3 发展趋势3. 课题内容相关技术与方法介绍1. 微信小程序开发技术2. 深度学习模型选型2.1 MobileNetV22.2 ResNet-503. 系统架构设计4. 关键技术实现4.1 实时拍摄指导4.2 多模态建议生成…

web布局02

Web 发展的每个不同时期都有新的技术为 Web 布局提供支持&#xff0c;但不管是哪个时期&#xff0c;Web 布局相关的概念和术语都是相同的。如果你想彻底或者更好地掌握 Web 布局&#xff0c;那么首先需要对 Web 布局相关的技术术语有所了解。 在这一节中&#xff0c;我们一起来…

Mac电脑 窗口分屏管理 Magnet Pro

Magnet Pro Mac&#xff0c;是一款功能强大的窗口分屏管理工具&#xff0c;具有多种布局模式、窗口布局功能和其他工具&#xff0c;可以帮助您高效地进行多任务处理和管理工作。 拖动窗口到边缘&#xff0c;可将窗口大小调整到屏幕的一半。拖动窗口到角落&#xff0c;可将窗口…

http2与websocket关系

HTTP/2 和 WebSocket 协议本身确实不兼容&#xff0c;不能像在 HTTP/1.1 中那样用标准 WebSocket 协议&#xff08;ws:// / wss://&#xff09;进行升级握手。但这事儿细节比较多&#xff0c;下面详细讲讲&#xff1a; ✅ HTTP/2 与 WebSocket 的关系 HTTP/2 不直接支持 WebSo…

LoRA 与 CoT 冲突吗

对于一个具有CoT 能力的模型来说&#xff0c;采用普通的数据对其进行LoRA 微调可能会使原模型丢失CoT 能力&#xff0c;从而我们进行思考如下 CoT 与 LoRA 的“冲突”理解 目标不完全一致 导致的效果优化方向&#xff1a; CoT 侧重于提高推理能力和可解释性&#xff0c;它鼓励…

Python爬虫-爬取票牛明星演唱会数据,进行数据分析

前言 本文是该专栏的第61篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以“票牛”平台为例。基于Python爬虫,采集“票牛”平台的明星演唱会(包含“演出城市,演出票价,演出时间”等等)的数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整…

uniapp的video遮盖了popup

video的默认层级太高&#xff0c;导致popup弹出的时候&#xff0c;部分被video遮挡了 可以利用cover-view&#xff0c;将popup以及内部所有的标签&#xff0c;全都换成cover-view&#xff0c;然后用一个变量控制其显隐 比如原始&#xff1a; 现在&#xff1a;

java面试题02访问修饰符有哪些?区别是什么?

访问修饰符是面向对象编程中实现封装的核心机制&#xff0c;用于控制类、属性、方法等成员的可见性&#xff08;可访问范围&#xff09;。不同的访问修饰符决定了其他类或代码在何处可以访问这些成员。 主要的访问修饰符及其区别如下&#xff08;以 Java 和 C# 为代表&#xf…

在小程序中实现上下左右拖动表格

在小程序的开发中&#xff0c;不可避免会出现上下左右拖动表格的类似需求&#xff0c;下面将把这个简单实现一下 其中主要使用到了overflow: scroll;来使得横向和纵向可以滚动&#xff0c;并且使用负边距 父容器截断的方法来同时隐藏横向和纵向滚动条&#xff0c;从而实现该效…

[MSPM0开发]之九 MSPM0G3507的ADC

[MSPM0开发]之九 MSPM0G3507的ADC 一、 MSPM0G3507 ADC概述二、 MSPM0G3507 ADC系统框图2.1 电压基准2.2 分辨率2.3 硬件均值计算2.4 采样触发源和采样模式2.5 转换模式2.6 转换结果数据格式2.7 高级特性2.7.1 非FIFO模式下的ADC操作&#xff08;单次转换和重复单次转换&#x…

门锁开关;与我们生活中紧密联系!

门锁开关作为日常生活的核心安全组件&#xff0c;其设计与应用直接影响家居安全、使用便捷性及设备寿命&#xff0c;以下是其关键价值与技术要点的系统分析&#xff1a; &#x1f512; ‌一、基础功能&#xff1a;安全与便利的平衡‌ ‌物理防护核心‌ ‌锁体结构‌&#xff1…

WRF-Hydro分布式水文模型:洪水预报、水资源管理与规划、生态水文研究、气候变化影响评估、流域综合管理、水电工程规划与运行

目录 第一部分&#xff1a;WRF-Hydro模型功能及运行流程、依赖库准备 第二部分&#xff1a;WRF-Hydro模式编译、离线运行及案例实践 第三部分&#xff1a;结合多案例进行模式数据制备及实践应用 【内容简述】&#xff1a; WRF-Hydro模型是一个分布式水文模型&#xff0c;‌…