内存优化

2020-08-31  本文已影响0人  差点长成一枚帅哥

一、JVM内存模型与分布

我们都知道JVM运行时的数据区域分为5大块

image.png

二、内存限制

android是基于Linux系统的,android中的进程分为两种:

adb shell getprop | grep dalvik.vm.heapgrowthlimit

可以在Androidmanifest文件中application节点加入android:largeHeap=“true”来增加其dalvik虚拟机中堆的大小
我们常说的堆大小其实是包涵两部分的,一是java的堆,而是native的堆,java堆中主要是一下java对象,由 C/C++申请的内存空间则在native堆中,也有一些对象需要结合native和java堆共同完成,比如bitmap,bitmap分为bitmap对象和其中存储的像素值,对象分配在java堆,而存储的像素值则根据版本不同存储的位置也不同,api 11 - api 25是存储在java堆中的,其他版本是存储在native堆中的

三、内存泄漏场景

1.静态引用

静态对象非法持有Activity上下文

2.匿名内部类,或非静态内部类

Handler,AsyncTask,TimerTask等,一般在处理多线程任务的时候

3.监听器

在Activity OnResume里面registListener,在OnPause一定要记得unregistListener

4.资源对象

BraodcastReceiver, ContentObserver,File,Cursor,Stream,Bitmap,Socket等资源,使用后未关闭会导致内存泄漏。这些对象JVM中有的只保存引用,而真实的数据存在JVM之外的内存,所以并非对象制为null即可,必须 调用 recycle, release, close等方法,清空内存。

4.WebView

在Activity的onDestory中调用 WebView的 clearHistory, clearView,destroy方法即可。

四、如何排查以及修复

1.LeakCanary
2.Android Studio 3.0 的 Android Profiler 分析器

五、如何进一步进行优化

1.shape代替图片资源
2.部分png图改jpg图,比如启动页
3.gradle配置shrinkResources属性,删除无效资源

1.删除冗余代码,减少编译带来的内存开销
2.第三方库so包的缩小, 能满足需求的情况下,尽量实用阉割版

上一篇下一篇

猜你喜欢

热点阅读