当前位置:首页 > 内存 > 正文

android内存泄漏的几种情况(android内存泄漏和内存溢出)

  • 内存
  • 2024-08-22 16:27:36
  • 1487

一、什么情况下会导致内存泄露Android的虚拟机是基于寄存器的Dalvik,其最大堆大小一般为16M。有的可能是24M。
下面解释了一些可能导致内存泄漏的原因,供大家参考。
1.对象内存太大
太大的内存中存储了太多的对象,导致超出内存限制。
2.源码发布
程序代码问题:上下文;某些资源(例如Cursor和IO流)会长期持有而无法释放,从而导致内存泄漏。
3.使用static关键字
static是Java中的一个关键字,用于修改成员变量;变量属于一个类;不是该类的实例。所以,静态修改的变量具有很长的生命周期,并且如果用于引用某些实例。这可能会导致内存泄漏。
静态的解决方案:
引用Context等事件时,应尽量避免消耗过多资源的静态成员变量。
Context应尽量使用生命周期较长的ApplicationContext。,不会出现对它的引用。
使用弱引用而不是强引用。例如,可以使用WeakReferencemContext;
4线程导致内存溢出
线程导致内存溢出的主要原因是线程生命周期无法控制。例如,当我们横竖屏切换时;通常应该重新创建该函数并销毁旧函数。但是现在我们在子线程中运行耗时的操作,旧的操作不会被销毁,就会发生内存泄漏。
解决方案:
将线程内部类改为静态内部类。
使用弱引号在线程内存储上下文引用。


二、android中什么是内存泄漏内存泄漏是指创建的对象没有被使用,而是一直占用内存,这会导致机器越来越卡:
单例模式
单例模式使用不当可以引起内存泄漏泄漏的一个常见问题是单例对象在初始化后(以静态变量的形式)将存在于JVM的整个生命周期中。如果单例对象持有对外部对象的引用,那么该外部对象将无法被JVM正常使用。回收,造成内存泄漏。
如果需要Context,请尝试引用Application而不是Activity。
Android组件或特殊集合对象的使用
BroadcastReceiver、ContentObserver、FileObserver、Cursor、Callback等必须在ActivityonDestory或某类生命周期结束后注销或关闭,否则Activity类将被系统强制引用不会被内存回收。不要直接引用Activity作为成员变量。如果您必须这样做,请使用privateWeakReferencemActivity。同样,对于Service等其他有自己生命周期的对象,直接引用时也需要仔细考虑是否会出现内存泄漏。可能的。
Handler
Handler的生命周期与Activity不一致