Android内存泄漏与内存溢出

内存泄漏

什么是内存泄漏

某个对象在该释放的时候由于被其他对象持有而没有被释放,即new出来的对象在内存中无法被GC回收,造成内存泄露。
内存泄漏发生时的主要表现为内存抖动,可用内存慢慢变少。在AndroidStudio中的AndroidMonitor(memory)中可以观察App的内存使用情况。

内存泄漏的原因

  1. 静态变量引用了Activity对象。
  2. 属性动画导致的内存泄漏。
    如果在Activity中播放无限循环的属性动画,且在onDestory中未停止动画,则在Activity销毁后,虽然在界面上无法看到动画效果,但此时Activity中的某个View会被该动画持有,而View又持有了Activity,最终Activity无法释放。
    需要通过在onDestory中调用animator.cancel()来停止动画防止内存泄漏。

内存泄漏检测工具LeakCanary

通过LeakCanary可以为我们找到内存泄漏的位置,但并不能够提供我们内存泄漏的原因,有时内存泄漏的位置是由于其他原因导致的。

Java中的内存分配

  1. 静态储存区:编译时就分配好,在程序整个运行期间都存在。它主要存放静态数据和常量;
  2. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存;
  3. 堆区:通常存放new出来的对象。由Java垃圾回收器回收。

Java中的四种引用类型

  1. 强引用(StrongReference):JVM宁可抛出OOM,也不会让GC回收具有强引用的对象;
  2. 软引用(SoftReference):只有在内存空间不足时,才会被回收的对象;
  3. 弱引用(WeakReference):在GC时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存;
  4. 虚引用(PhantomReference):任何时候都可以被GC回收,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否存在该对象的虚引用,来了解这个对象是否将要被回收。可以用来作为GC回收Object的标志。

腾讯内存泄漏分析

https://zhuanlan.zhihu.com/p/25213586

猜你喜欢

转载自blog.csdn.net/weixin_33642281/article/details/83758982