Android|Android 内存性能 Profiler、MAT
Profiler、MAT 的使用(Android Studio 生成的 hprof 文件如何用 eclipse 的 MAT 分析)
https://www.jianshu.com/p/676d04243800
转载请注明出处
https://github.com/WaterYuanData/f2/tree/testMemory/testmemory
内存抖动
原因:短时间
内创建
(GC销毁)大量
临时对象
影响:卡顿(GC阻塞主线程)
场景:循环内字符串拼接、log打印,自定义动画的onDraw()中新建对象等,
Color.parseColor内通过subString新建String对象
性能分析工具Profiler中Record/Stop
文章图片
profile查看内存抖动.PNG 编译.java文件
为.class字节码
文件
javac MyMemory.java
对字节码进行反编译
javap -c MyMemory.class
查看
循环里new了一个StringBuilder
文章图片
new了一个StringBuilder.PNG 内存泄漏
该释放的没被释放,该回收的没被回收。
长生命周期对象持有短生命周期对象的强引用
,从而导致短生命周期对象无法被回收。
场景:
- 单例持有Activity的Context导致Activity无法被回收,进而
导致Activity的成员也无法被回收
。
ps:单例持有Activity的成员会导致Activity无法被回收吗? - 自定义View若在onAttachedToWindow()中开启动画,则需要在onDetachedFromWindow()中
ValueAnimtor.removeAllUpdateListeners();
ValueAnimtor.cancle();
被GC Roots直接或者间接引用则会导致无法被回收
非静态内部类默认持有外部类的强应用,
比如解决Handler的内存泄漏,
mHandler.removeCallbacksAndMessages(null)
常使用弱引用的原因:
软引用在非内存不足的GC时仍不能回收,故仍有内存泄漏
性能分析工具Profiler中的Dump
文章图片
Main2Activity泄漏.PNG hprof文件的装换:
借助Sdk\platform-tools下hprof-conv命令,platform-tools在环境变量中则可直接使用
hprof-conv -z
源文件.hprof
转换生成的文件.hprof
比如 hprof-conv.exe -z a.hprof b.hprof
MAT查看强引用:
MAT的官方下载地址
怎么计算和验证文件的SHA值
MAT中
Open Heap Dump
转换生成的文件.hprof
直方图
合并到GC Roots的最短引用
排除所有的虚弱软引用
文章图片
Main2Activity泄漏的原因是.PNG MAT比Menmery Monitor更强大
ps:
GC的实现:CMS垃圾回收器
使用标记-清除算法:内存碎片
GC的触发
申请GC,System.gc(),GC不一定立即执行
新生代,老年代
onAttachedToWindow(),自定义动画显示到窗口时被调用
MyEclipse官方中文网
Android 内存 - 获取单个应用内存限制
adb shell getprop | grep dalvik
[dalvik.vm.appimageformat]: [lz4]
[dalvik.vm.boot-dex2oat-threads]: [4]
[dalvik.vm.checkjni]: [false]
[dalvik.vm.dex2oat-Xms]: [64m]
[dalvik.vm.dex2oat-Xmx]: [512m]
[dalvik.vm.dex2oat-threads]: [4]
[dalvik.vm.heapgrowthlimit]: [384m]
[dalvik.vm.heapmaxfree]: [8m]
[dalvik.vm.heapminfree]: [512k]
[dalvik.vm.heapsize]: [512m]
[dalvik.vm.heapstartsize]: [8m]
[dalvik.vm.heaptargetutilization]: [0.75]
[dalvik.vm.image-dex2oat-Xms]: [64m]
[dalvik.vm.image-dex2oat-Xmx]: [64m]
[dalvik.vm.image-dex2oat-threads]: [4]
[dalvik.vm.isa.arm.features]: [default]
[dalvik.vm.isa.arm.variant]: [cortex-a15]
[dalvik.vm.isa.arm64.features]: [default]
[dalvik.vm.isa.arm64.variant]: [generic]
[dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
[dalvik.vm.usejit]: [true]
[dalvik.vm.usejitprofiles]: [true]
[persist.sys.dalvik.vm.lib.2]: [libart.so]
[ro.dalvik.vm.native.bridge]: [0]
Runtime.getRuntime().maxMemory()Android 查看每个应用的最大可用内存
long maxMemory = Runtime.getRuntime().maxMemory();
Log.i(TAG, "onCreate: " + (maxMemory / 1024 / 1024));
I/MainActivity: onCreate: 384
dalvik.vm.heapgrowthlimit(仅仅针对dalvik堆,不包括native堆)
dalvik.vm.heapsize(如果存在heapgrowthlimit参数,则以heapgrowthlimit为准)
Android应用程序的默认最大内存值以及修改
Android——Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
【Android|Android 内存性能 Profiler、MAT】https://github.com/square/leakcanary
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)