Android 内存优化等记录

Android  小知识  2023年4月30日 am7:51发布2年前 (2023)更新 91es.com站长
73 0 0

前言

记录一下内存相关的内容

正文

Java虚拟机

Java虚拟机是一台“抽象的计算机”,它拥有自己的处理器,堆栈,寄存器以及相应的指令系统。

Java虚拟机疲敝了与操作系统相关的平台信息,使得Java程序只需要生成该虚拟机上运行的目标代码,就可以在多个平台上运行。

JVM运行时数据区域

分为两个部分,线程独占和线程共享。

线程独占部分

每个线程都会有它独立的空间,随着线程生命周期而创建和销毁。

虚拟机栈,本地方法和程序计数器

线程共享部分

所有线程都可以访问这块内存数据,随虚拟机或者GC而创建和销毁。

方法区,Java堆

方法区

JVM用了存储加载的类信息,常量,静态变量和编译后的数据等。

堆内存

JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。

如果满了,就会出现OutOfMemoryError

虚拟机栈

每个线程都在这个空间有个私有的空间。

线程栈由多个栈帧(Stack Frame)组成。

一个线程会执行一个或多个方法,一个方法对应一个栈帧。

强,软,弱,虚引用

  1. 强引用 : 强引用的对象,垃圾回收器绝对不会回收,宁愿OutOfMemory异常

  2. 软引用 : 软引用的对象,当内存不够时,垃圾回收器会回收,如果回收的内存还是不够,就抛出OutOfMemory

  3. 弱引用 : 弱引用的对象,垃圾回收器不会管当前内存是否足够,都会回收

  4. 虚引用 : 如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收器回收,只是当它回收时会收到一个系统通知。

垃圾标记算法

引用计数算法

每一个对象都有一个引用计数器,当对象被引用时就加1,引用失效就减1。当计数为0时则将对象置为可回收的“垃圾对象”。

根搜索算法

垃圾收集算法

标记-清除算法

对标记可回收的对象就行回收。

内存碎片化,消耗大

复制算法

先把内存一分为二,每次只使用其中一块区域,垃圾搜集时,将存活的对象拷贝到另外一个区域,然后对之前区域就行全部回收。

缺点:可用内存变小

标记-压缩算法

在标记可回收的对象后,将所有的存活对象压缩在内存的一端,让他们排在一起,然后对端边界外的内存进行回收。

分代收集算法

根据对象生命周期长短进行放在不同的区域。

内存泄露

一个不再被程序使用的对象或变量依旧存活在内存中无法被回收

内存溢出

当程序申请内存时,没有足够的内存提供给程序使用。

out of memory

内存抖动

短时间内多次内存的分配和释放。

主要原因是短时间内多次创建对象。

频繁GC会导致画面卡顿,因为其他线程会被挂起等待GC完成。

PS : UI绘制是16ms一帧,如果没有规定时间内绘制好久会出现卡顿。

内存分析工具

  1. MAT

  2. Android Studio Profiler

  3. LeakCanary

参考文章

 历史上的今天

  1. 2024: Android的编译(0条评论)
  2. 2020: Only the original thread that created(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

杨绛:喝茶

曾听人讲洋话,说西洋人喝茶,把茶叶加水煮沸,滤去茶汁,单吃茶叶,吃了咂舌道:“好是好,可惜苦些。”新近看到一本美国人做的茶考,原来这是事实。茶叶初到英国,英国人不知怎么吃法,的确吃茶叶渣子,还拌些黄油和盐,敷在面包上同吃。什么妙味,简直不敢尝试。以后他们把茶当药,治伤风,清肠胃。不久,喝茶之风大行,...

Android.mk介绍之一基础语法

Android.mk一系列文章计划介绍内容如下几个章节:1、Android.mk介绍之一基础语法2、Android.mk介绍之二预编译生成的文件类型3、Android.mk介绍之三引用静态库,动态库1、Android.mk的基本语法对于Android开发,尤其是Android源码开...

Android自动截图bat脚本

开发中有时候需要截图,工程师截图就好多了,但是测试工程师截图就有点麻烦。作者原话:做开发的总会碰到测试或者项目经理问你要某个界面截图的情况,用手机的快捷键截图再上传效率不高,又不太想用手机助手(怕全家桶),便打起Android的ADB命令的主意。adb指令中screencap指令就是截图方法,再...

[摘]dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算

前言最近因为一个紧急的项目,客户要求摘他另外一个客户的样机,为了赶进度,我们通过反编译样机中的应用,获取UI和布局等。但,做出来后,效果总感觉有些不一样,比如显示的字体大小。最后发现,我们调试的样机分辨率虽然跟样机一样,但密度不一样。客户的样机:240dpi我们的设备:160dpi获取...

Java Consumer的使用

前言今天有空整理一下Consumer<T> 接口的使用,一般用于回调中。这里简单记录一下。正文Consumer<T>接口是java 1.8才有的,定义如下://java.util.function.Consumer@FunctionalInterfacepu...

StringBuffer 和 StringBuilder区别简介

前言StringBuffer和StringBuilder虽然经常用,但偶尔忘记他们之间的区别,这里简单整(摘)理(抄)一下,方便自己查阅。PS:好记性不如烂笔头正文StringBuffer 和 StringBuilder都是可变的字符串,但他们两之前还是有不少的区别。StringBuff...