Android 内存泄漏分析工具

在上篇文章中了解了什么是「Android 开发中的内存泄漏」,这篇来记录一下在 Android App 开发中可以用什么工具来帮助开发者发现以及消除内存泄漏

Android Studio Profiler 工具

Android Studio 作为官方的 Android App 开发 IDE,功能越来越强大,从 Android Studio 3.0 开始提供 Profiler 来对 App 的 CPU、内存、网络、电量进行检测,帮助开发者发现 App 运行时潜在的问题
Android Studio Profiler

繼續閱讀
Android 开发中的内存泄漏

Android 开发中的内存泄漏

什么是内存泄漏

定义

程序中动态分配的内存因为某种原因未释放或无法释放

通俗的讲,就是一个长生命周期对象 A 持有了一个短生命周期 B 对象的引用,导致 B 销毁时无法被 GC 回收,造成的内存浪费。

危害

  • 用户对单次的内存泄漏并没有什么感知,但是当泄漏积累到内存都被消耗完,就会导致卡顿,甚至崩溃;
  • gc回收频繁 造成应用卡顿ANR:
  • 当内存不足的时候,gc会主动回收没用的内存.但是,内存回收也是需要时间的.- 内存回收和gc回收垃圾资源之间高频率交替的执行.就会产生内存抖动.
  • 很多数据就会污染内存堆,马上就会有许多GCs启动,由于这一额外的内存压力,也会产生突然增加的运算造成卡顿现象,
  • 任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行,所以垃圾回收运行的次数越少,对性能的影响就越少;
繼續閱讀
如何强制 Gradle 统一远程依赖库版本

如何强制 Gradle 统一远程依赖库版本

在 Android 开发中免不了需要通过 Gradle 进行远程依赖官方库或者第三方 SDK,相信大家遇到过这样一个痛点,这个远程依赖本身也依赖了其他第三方库,而工程可能因为兼容性考虑,需要的的不是这个版本,以下举例一个场景:

示例

依赖 Retrofit 最新版本:

1
implementation "com.squareup.retrofit2:retrofit:2.9.0"

通过终端输入指令:

macOS:

1
./gradlew [module_name]:dependencies

Windows:

1
gradlew [module_name]:dependencies

以上 [module_name] 换成需要打印的模块名,比如 app

繼續閱讀
算法第五周

算法第五周

1.汉诺塔问题

描述

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:

  1. 每次只能移动一个盘子;
  2. 盘子只能从柱子顶端滑出移到下一根柱子;
  3. 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。
你需要原地修改栈。

繼續閱讀
算法题-第四周

算法题-第三周

1.计算器

给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,
,/ 四种运算符和空格  。 整数除法仅保留整数部分。

  • 示例 1:
    输入: “3+2*2”
    输出: 7
  • 示例 2:
    输入: " 3/2 "
    输出: 1
  • 示例 3:
    输入: " 3+5 / 2 "
    输出: 5

说明:你可以假设所给定的表达式都是有效的。请不要使用内置的库函数 eval。

繼續閱讀
算法题-第一周

算法题-第一周

1.URL化

描述

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

繼續閱讀
算法题-第二周

算法题-第二周

1.两数相加

给你两个「非空」的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

繼續閱讀