美文网首页
Android性能优化 内存泄漏和内存溢出

Android性能优化 内存泄漏和内存溢出

作者: ForeverValid | 来源:发表于2020-06-23 14:32 被阅读0次

内存泄漏

内存泄漏是指某些对象本应该被GC回收,但是由于他们的引用被其他对象持有而导致GC回收失败,
从而无法回收占用的内存,结果导致这些无用对象仍然占据着堆中的内存空间,成为内存泄漏。
  
内存泄露的危害:
(1)过多的内存泄露会导致内存被过多占用,容易发生OOM
(2)内存泄露可能给会导致内存不足,然后频发发生GC,可能会导致UI卡顿,线程停止等问题。

内存溢出

Android为每个进程会设置一个内存的阈值,如果超过这个阈值则会发生内存溢出,程序就会崩溃。
  
内存溢出的危害:
程序可能会崩溃,为什么是可能,因为内存溢出可以被try——catch。

常见的内存泄露场景

1.非静态内部类的内存泄露

原因:非静态内部类会持有外部类的this引用,因此可以访问外部类的静态和非静态变量。
如果内部类的生命周期超过外部类,则会导致外部类无法被及时回收

解决方法: 创建static静态变量,并通过弱引用WeakReference来引用外部资源

2.单例模式持有Activity的引用

原因:在单例模式中,如果传入Activity的Context,那么在Activity退出时,
由于Context持有Activity的引用, 因此导致Activity不会被回收

解决方法:改为Application的Context

3.资源未关闭导致

 比如数据库,文件,广播,Stream,Bitmap等

常见的内存溢出场景

内存溢出原因: 
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 
3.代码中存在死循环或循环产生过多重复的对象实体; 
4.使用的第三方软件中的BUG; 
5.启动参数内存值设定的过小

内存溢出的原因及解决方法:
1.修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
2.检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
3.对代码进行走查和分析,找出可能发生内存溢出的位置。
4.使用内存查看工具动态查看内存使用情况 

相关文章

网友评论

      本文标题:Android性能优化 内存泄漏和内存溢出

      本文链接:https://www.haomeiwen.com/subject/jihhfktx.html