##背景
-
最大的线上内存问题就是内存泄漏; 内存溢出和内存抖动,一般都是 与内存泄漏导致的 内存无法释放 相关联; 如果解决了内存泄漏, 那 线上内存问题 就会减少很多;
-
线上内存监控比较困难, 没办法使用线下的MP、ART等工具去发现问题;
#常规实现 ####注意在线上的一些特定场景
-
处于 高内存占用的状态 一个APP占用的内存 已经超过了 单个APP最大可用内存的 80%;
-
其他类似情况;
####常规方案一
-
当出现 这种
特定的线上场景的时候, Dump一下线上内存:Debug.dumpHprofData()这一行代码可以实现, 将当前的内存信息,转化为一个文件; -
在合适的时机, 回传内存文件; 这个文件其实会比较大, 一定不要在 用户处于 数据流量上网的状态 去上传, 要等 用于处于WiFi上网的时候 再去上传;
-
通过MP、MAT 手动分析内存文件;
-
方案总结:
-
Dump文件太大, 和 用户使用APP的时间 以及 对象的数量 正相关, 可以用Native Hook 裁剪文件,但是结果文件仍然会很大(几十M);
-
(由于文件比较大)上传的失败率高, 手动分析 大量的 大文件 也很困难;
-
配合一定策略,有一定的效果;
-
####常规方案二
-
把LeakCanary带到线上
-
预设泄漏怀疑点 LeakCanary在线上 会对预设的泄漏怀疑点 进行监控、分析;
-
发现泄露时 回传结果
-
方案总结:
-
不适合所有情况,必须预设怀疑点; 所以没有预设怀疑点的对象,是没有办法进行 监控和分析的, 方案全面性受到限制;
-
LeakCanary分析过程比较耗时,容易OOM;
-