常见原因1.集合类如果一个集合类只有添加元素的方法而没有相应的删除机制,就会占用内存。如果集合类是全局变量(比如类中的静态属性,全局map等,有静态引用或者final指向它),那么没有相应的删除机制,可能会导致内存被占用靠收藏来只增不减。没有减少。2、单例模式不正确。使用单例模式是导致内存泄漏的常见问题。单例对象初始化后,会贯穿JVM的整个生命周期(以静态变量的形式存在)。如果单例对象持有外部对象,则外部对象将不会被JVM正常回收,从而导致内存泄漏。要注销或者关闭,否则这个Activity类会被系统强引用,不会被内存回收。不要直接将Activity作为成员变量引用。如果您必须这样做,请使用私有WeakReferencemActivity。同样,对于Service等其他有自己生命周期的对象,直接引用也需要慎重考虑是否会存在内存泄露的可能。4、Handler需要知道只要Handler发送的Message没有被处理,Message和发送它的Handler对象就会一直被线程MessageQueue持有。由于Handler是TLS(ThreadLocalStorage)变量,生命周期与Activity不一致。所以一般很难保证这个实现和View或者Activity的生命周期是一致的,所以很容易导致无法正确释放。上面说到Handler的使用要特别小心,否则很容易导致内存泄漏。5.线程内存泄漏线程也是内存泄漏的一个重要来源。线程内存泄漏的主要原因是不可控的线程生命周期。例如,如果线程是Activity的内部类,则在线程对象中保存对Activity的引用。当线程的run函数耗时较长且没有结束时,thread对象不会被销毁,所以它引用的旧Activity不会被销毁。不会被销毁,所以存在内存泄漏问题。6、一些糟糕的代码造成的内存压力有些代码不会造成内存泄漏,但要么没有及时有效释放未使用的内存,要么没有有效使用现有对象却频繁申请新对象。记忆。6.1位图不调用recycle()。当Bitmap对象不被使用时,我们应该先调用recycle()释放内存,然后设置为null。因为加载Bitmap对象的内存空间一部分是java,一部分是C(因为Bitmap分配的底层是通过JNI调用的)。而这个rec??yle()是针对C部分的内存释放的。6.2构造Adapter时,没有使用缓存的convertView。举几个业务测试过程中常见的内存泄露例子来说明:1.回调只有add操作,没有logoutremove。从引用关系可以看出,当前视图是通过回调引用的,而回调又是通过外部对象sharkprotocolQueue引用的,导致泄漏。2.发送延时消息时,如果消息没有处理,退出页面后无法回收页面。Android应用启动时,会创建UI主线程的Looper对象,该对象存在于整个应用生命周期中,用于处理消息队列中的Message。这些消息改为引用发送消息的处理程序对象。那么问题来了,如果这些Handler是Activity的内部类,那么当这些Handler的消息没有被处理或者消息本身就是延迟消息的时候,就会造成Activity到Handler到Message到Looper之后的引用链Activityexits一直存在,导致Activity泄漏!3、在异步线程完成之前退出Activity等组件,可能会导致界面资源释放失败。这种情况是典型的线程对象导致的内存泄漏。原因也很简单。直到线程Thread对象的run任务执行完毕,对象本身才会被释放。因此,如果Activity等组件对象中的线程对象成员有耗时任务(一般是耗时任务),就会造成一直持有组件本身引用的内存泄漏!本文部分内容和经验摘自网络,结合本次内存泄漏排查总结。良好实践对活动和其他组件的引用应控制在活动的生命周期内;如果不是,请考虑使用getApplicationContext或getApplication来避免活动被外部长生命周期对象泄露。代码审查时注意长生命周期对象:全局集合、单例模式的使用、类的静态变量等。尽量不要在静态变量或静态内部类中使用非静态外部成员变量(包括上下文)。即使要使用它们,也应该考虑适时清空外部成员变量;您还可以在内部类中使用弱引用来引用外部类。多变的;Handler****持有的引用对象使用弱引用,释放资源时也可以清除Handler中的消息。比如Activity在onStop或onDestroy时,取消Handler对象的Message和Runnable:removeCallbacks(Runnabler)或removeMessages(intwhat),或removeCallbacksAndMessages(null)等。线程Runnable执行耗时操作,注意页面返回时及时取消或者将Runnable写成静态类。a)如果线程类是内部类,则改为静态内部类。b)如果需要在线程中引用context等外部类对象,则需要使用弱引用。在Java的实现过程中,还应该考虑到它的对象释放。最好的办法是在对象不用的时候显式清空,比如清空直接或间接引用图片等资源的数组。(使用array.clear();array=null),***遵循谁创建谁释放的原则。腾讯Bugly简介Bugly是腾讯内部产品质量监控平台的外挂版。其主要功能是监控并上报App上线后用户端发生的崩溃、卡顿等情况,以便开发者第一时间了解App。质量情况,及时修改机型。目前,腾讯所有内部产品都在使用它来监控线上产品的崩溃。
