Android OOM问题定位、内存优化

一、常用工具:

1、LeakCanary

val refWatcher: RefWatcher? = TestApp.getRefWatcher(activity)
refWatcher?.watch(activity);//检测是否有泄露,即触发GC回收,看activity是否被回收,没有被回收就是泄露了。

二、常见的几种内存泄漏
单例造成的内存泄露

非静态内部类创建静态实例造成的内存泄露

Handler造成的内存泄露

线程造成的内存泄露

Webview造成的内存泄露

三、如何优化内存

1、减小对象的内存占用

2、内存对象的复用

3、避免对象的内存泄露

四、GC回收原理

GCRoot——对象可达性分析

可回收对象的判定
通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。

五、Java内存分配模型

GCRoot是:方法区Method Area、虚拟机栈VM Stack(即本地变量)、本地方法栈Native Method(即静态变量和常量) Stack中的变量。如GCRoot中变量有对堆中对象的引用,gc则不回收堆中的该对象,如堆中对象无来自GCRoot的引用,则回收该对象。例如,B b = new B();对象b为引用存于虚拟机栈VM Stack中,new出的B对象存于堆中。

六、Android profiler——dump内存快照分析

双击打开设备Downloads文件夹下hprof文件,文件信息在profiler中被显示。

shallow size浅堆和Retain size深堆的区别

shallow size(浅堆)是指对象本身占用内存的情况

Retain size(深堆)是指对象以及对象关联其他引用占用内存的总和。即,对象本身被GC回收后,导致其他对象同时也被GC回收,这些被回收的所有对象占用内存总和。

如下举例:

1、对象A,B,C内存占用情况如下,A的shallow size是10M,Retain size是30M

1、对象A,B,C,D内存占用情况如下

A的shallow size是10M,Retain size是20M

B的shallow size是10M,Retain size是10M

C的shallow size是10M,Retain size是10M

D的shallow size是10M,Retain size是10M

七、Java的四种引用
1.强引用(Strong Reference)在代码中普遍使用的,类似Person person=new Person();如果一个对象具有强引用,则无论在什么情况下,GC都不会回收被引用的对象。当内存空间不足时,JAVA虚拟机宁可抛出outOfMemoryError终止应用程序也不会回收具有强引用的对象。
2.软引用(Soft Reference)表示一个对象处在有用但非必须的状态。如果一个对象具有软引用,在内存空间充足时,GC就不会回收该对象;当内存空间不足时,GC会回收该对象的内存(回收发生在0utofMemoryError之前)。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被GC回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中,以便在恰当的时候将该软引用回收。但是由于GC线程的优先级较低,通常手动调用system.gc()并不能立即执行GC,因此弱引用所引用的对象并不一定会被马上回收。

3.弱引用(Weak Reference)用来描述非必须的对象。它类似软引用,但是强度比软引用更弱一些:弱引用具有更短的生命,GC在扫描的过程中,一旦发现只具有被弱引用关联的对象,都会回收掉被弱引用关联的对象。换言之,无论当前内存是否紧缺,GC都将回收被弱引用关联的对象。

4.虚引用(Phantom Reference)虚引等同于没有引用,这意味着在任何时候都可能被GC回收,设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。(被用来跟踪对象被GC回收的活动)虚引用和弱引用的区别在于:虚引用在使用时必须和引用队列(ReferenceQueue)联合使用,其在GC回收期间的活动如下:ReferenceQueue queue=new ReferenceQueue();PhantomReference pr=new PhantomReference(obiect.queue)也即是GC在回收一个对象时,如果发现该对象具有虚引用,那么在回收之前会首先该对象的虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否被GC回收。

软引用和弱引用的区别如下:

软引用:gc扫到,不一定回收,内存不足时才回收

弱引用:gc扫到,就回收。

弱引用和引用队列的关系如下:

泄露了:弱引用没有加入引用队列,故引用队列为空

没有泄露:弱引用加入引用队列,故引用队列不为空

八、Java新生代,老年代和永久代的区别

在Java虚拟机(JVM)的内存管理中,堆内存通常被划分为几个不同的区域,以便更有效地管理和回收内存。以下是新生代(Young Generation)、老年代(Old Generation)和永久代/元空间(PermGen/Metaspace)的具体含义:

1. 新生代 (Young Generation)
- 新生代是Java堆内存的一部分,主要用于存储新创建的对象。对象在首次分配内存时会被放入新生代。

- 新生代的特点是大量对象在此快速生成并很快消亡,因此这里的垃圾回收(Garbage Collection, GC)非常频繁,通常称为Minor GC或Young GC。

- 新生代进一步细分为 Eden 区、两个 Survivor 区(例如:From 和 To 区),每次GC后,存活下来的对象会被复制到另一个Survivor区,若对象经历了一定次数的GC还存活,则晋升至老年代。

2. 老年代 (Old Generation)
- 老年代也是Java堆内存的一部分,主要存放经过一定时间周期仍然存活下来的对象,即经历过多次新生代GC仍然没有被回收的对象。

- 对象一旦晋升到老年代,意味着它们生命周期较长,老年代的垃圾回收相对较少,但是一旦发生,通常会是Major GC或Full GC,这类GC会比Minor GC更加耗时且影响更大。

3. 永久代 (PermGen)
- 在JDK 8及之前版本的HotSpot JVM中,永久代是方法区的一个实现,用于存储类信息、常量池、静态变量、方法字节码以及其他运行时常驻数据结构。

- 永久代的空间有限,如果加载了大量的类或者反射操作过于频繁,可能导致永久代空间不足,从而抛出`java.lang.OutOfMemoryError: PermGen space`异常。

4. 元空间 (Metaspace)
:
- 自JDK 8开始,HotSpot JVM取消了永久代的概念,并引入了一个新的内存区域叫做元空间(Metaspace)。

- 元空间同样用于存储类元数据信息,但它位于本地内存(Native Memory)而非堆内存中,这意味着它的大小不再受到JVM堆大小的限制,而受限于系统的实际可用内存。

- 当类元数据的总量超过了指定阈值或者系统内存限制时,将会触发类卸载机制,并可能出现`java.lang.OutOfMemoryError: Metaspace`异常。

总结起来,新生代和老年代是用来区分对象生命周期长短进而进行高效内存回收的堆内存区域,而永久代在旧版JVM中是方法区的一种实现方式,存储类和方法级别的元数据;在新版JDK中,这部分功能由元空间替代。

九、OOM问题的原因以及如何快速定位

                        
参考:https://blog.csdn.net/pengweid/article/details/137125832

参考:彻底解决Android开发中的OOM问题,竟然一节课就够了_哔哩哔哩_bilibili

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

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

相关文章

TCP 重传、滑动窗口、流量控制、拥塞控制(计算机网络)

重传机制 TCP 针对数据包丢失的情况,会用重传机制解决。 接下来说说常见的重传机制: 超时重传快速重传SACKD-SACK 超时重传 重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后&#xff0c…

实验2 路由器基本配置

实验2 路由器基本配置 一、 原理描述二、 实验目的三、 实验内容四、 实验步骤1.建立实验拓扑2.基础配置3.配置路由器接口IP地址4.查看路由器配置信息5.连通性测试6.使用抓包工具 一、 原理描述 华为设备支持多种配置方式,操作人员要熟悉使用命令行的方式进行设备管…

SecureCRT通过私钥连接跳板机,再连接到目标服务器(图文教程)

文章目录 1. 配置第一个session(跳板机)2. 设置本地端口3. 设置全局firewall4. 配置第二个session(目标服务器) 服务器那边给了一个私钥,现在需要通过私钥连接跳板机,再连接到目标服务器上 🍉 …

算法打卡day40|动态规划篇08| Leetcode 139.单词拆分|多重背包理论|背包问题总结篇

目录 算法题 Leetcode 139.单词拆分 个人思路 解法 动态规划 回溯法 多重背包理论基础 背包问题总结篇 解题思路 背包递推公式 遍历顺序 01背包 完全背包 算法题 Leetcode 139.单词拆分 题目链接:139.单词拆分 大佬视频讲解:单词拆分视频讲解 个人思…

Redis系列之基于Linux单机安装

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。最近学习需要用到Redis,所以就去Linux服务器上部署一个,做下记录,方便…

【架构师】-- 浅淡架构的分类

什么是架构? 说到架构,这个概念没有很清晰的范围划分,也没有一个标准的定义,每个人的理解可能都不一样。 架构在百度百科中是这样定义的:架构,又名软件架构,是有关软件整体结构与组件的抽象描…

llama2.c与chinese-baby-llama2语言模型本地部署推理

文章目录 简介Github文档克隆源码英文模型编译运行中文模型(280M)main函数 简介 llama2.c是一个极简的Llama 2 LLM全栈工具,使用一个简单的 700 行 C 文件 ( run.c ) 对其进行推理。llama2.c涉及LLM微调、模型构建、推理端末部署&#xff08…

[计算机效率] 鼠标手势工具:WGestures(解放键盘的超级效率工具)

3.22 鼠标手势工具:WGestures 通过设置各种鼠标手势和操作进行绑定。当用户通过鼠标绘制出特定的鼠标手势后就会触发已经设置好的操作。有点像浏览器中的鼠标手势,通过鼠标手势操纵浏览器做一些特定的动作。这是一款强大的鼠标手势工具,可以…

机器学习(理论第一课)

一、理解人工智能、机器学习、深度学习、强化学习? 人工智能、机器学习和深度学习之间存在递进关系,它们的覆盖范围逐层递减。 **人工智能(Artificial Intelligence,AI)**是最宽泛的概念,旨在研究、开发用于…

AWS服务器有哪些优势?

作为一家总部在美国的公司,AWS为什么会受到中国企业的喜爱?他有什么优势?九河云作为AWS合作伙伴,将会带读者展现使用AWS的优势。 首先是作为跨国企业,AWS在全球有数十个区域节点,这种广泛的地域覆盖不仅有…

神经网络解决回归问题(更新ing)

神经网络应用于回归问题 神经网络是处理回归问题的强大工具,它们能够学习输入数据和输出之间的复杂关系。 神经网络提供了一种灵活且强大的框架,用于建模和预测回归问题。通过 适当的 网络结构、训练策略和正则化技术,可以有效地从数据中学…

大模型笔记:Prompt tuning

1 NLP模型的几个阶段 1.1 第一阶段(在深度学习出现之前) 通常聚焦于特征工程(feature engineering)利用领域知识从数据中提取好的特征 1.2 第二阶段(在深度学习出现之后) 特征可以从数据中习得——>…

大数据相关组件安装及使用

自学大数据相关组件 持续更新中。。。 一、linux安装docker 1、更新yum sudo yum update2、卸载docker旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine3、…

大话设计模式——18.策略模式(Strategy Pattern)

简介 是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。 UML图 应用场景 Java AWT中的LayoutManager(布局管理器&…

ARCHE-2024第三届上海国际智慧档案展览会暨高峰论坛即将开幕

一、ARCHE-2024精彩即将开幕 为进一步推动档案行业新科技创新应用与档案信息化再上台阶,加强档案行业交流互动,强化档案行业创新意识,实现相互促进、共同发展,作为6.9国际档案日系列活动的重要延伸——“2024第三届上海国际智慧档…

echarts 如何设置(dataZoom)多个图形的数据区域一起联动缩放响应

数据区域联动缩放需要用到 dataZoom 的专属事件 dispatchAction 实现多个数据区域联动缩放功能 <div style"width:100%;height:320px;" id"test01"></div> <div style"width:100%;height:320px;" id"test02"></…

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作&#xff0c;经常性发热严重&#xff0c;并且时间慢。直到昨天编译一个项目用时30分钟&#xff0c;电脑温度很高&#xff0c;并且有烧灼的味道&#xff0c;于是有了此篇文章。 二、…

C++(六个默认成员函数)

目录 六个默认成员函数构造函数析构函数拷贝构造函数 总结 六个默认成员函数 默认成员函数的概念&#xff1a;如果用户不显式写&#xff0c;编译器会自动生成的函数&#xff0c;就是默认成员函数 构造函数 构造函数是六个默认成员函数之一&#xff0c;构造函数的功能类似于init…

懒人必备!4个PS抠图技巧,让你轻松处理复杂背景!

今天带给大家的又是一个绝对重要的知识&#xff0c;那就是“抠图”&#xff01; 在我们的设计中&#xff0c;抠图可以说是最常见的运用啦&#xff0c;简单的PS抠图我们都会&#xff0c;但是最令我们头痛的人物或者动物的毛发的抠图了&#xff0c;很多人都抠不好&#xff0c;我…

合并单元格的excel文件转换成json数据格式

github地址: https://github.com/CodeWang-Ay/DataProcess 类型1 需求1: 类似于数据格式: https://blog.csdn.net/qq_44072222/article/details/120884158 目标json格式 {"位置": 1, "名称": "nba球员", "国家": "美国"…