(二十八)内存泄漏面试问题

一、Java内存泄漏基础知识

内存泄漏 :该被释放的对象没有被释放,一直被某些对象或者某些实例持有,导致不能垃圾回收。

1.java内存的分配策略

1)静态存储区 :主要存放静态数据、全局变量等等。程序编译的时候已经分配好了,在静态存储区中存储的变量,在整个程序运行期间都存在。

2)栈区 :在方法执行的时候,方法体内的局部变量会在栈上创建内存空间,并在方法执行结束后,这些变量和持有的内存会被自动释放。因为栈内存分配运算内置于处理器当中,所以效率很高,但是栈区的内存空间容量有限。

3)堆区 :动态内存分配,通常就是new对象出来的内存,不使用的时候将会由java的内存回收器来负责回收。

2.java是如何管理内存的

需要通过关键词new为对象申请内存空间,所有的对象都是在堆中分配内存空间的。内存的释放是由GC垃圾回收器来执行的。内存的分配是由开发人员完成的,内存的释放是由GC自动完成的。

3.java中的内存泄漏

内存泄漏是指无用对象(不再使用的对象)持续占有内存或者无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏。

二、Android内存泄漏基础知识

1.单例 : 应持有Application的引用,而不是Activity的引用。

2.匿名内部类 :匿名内部类应该设置成静态的,不然会一直持有外部类的引用。

3.Handler :应自定义一个静态Handler,在该Handler的内部持有传入Content的弱引用。

private MyHandler mHandler = new MyHandler(this);

private static class MyHandler extends Handler {
  private WeakReference<Context> reference;
  
  public MyHandler(Context context) {
    reference = new WeakReference<>(context);
  }
  
  @Override
  public void handlerMessage(Message msg) {
    MainActivity activity = (MainActivity) reference.get();
    if(activity != null) {
      activity.mTextView.setText("");
    }
  }
}

4.避免使用static变量 :可以使用懒加载。

5.资源未关闭造成的内存泄漏 :如文档、游标、Bitmap等资源,在Activity要销毁的时候,需关闭和注销这些资源。

6.AsyncTask造成的内存泄漏 :可以在onDestroy()方法中调用AsyncTask的cancel方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,372评论 11 349
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,654评论 0 8
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,237评论 2 7
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 802评论 0 5
  • 这是上天对我的恩赐让我有此段执迷的把玩岁月,我认为我雕琢的每一件都是独一无二的。最后部分佳品来自我的往年交杨老师,...
    阿建w阅读 465评论 4 3