栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

内存抖动 GC垃圾回收 Crash问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

内存抖动 GC垃圾回收 Crash问题

内存抖动

        指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现的原因主要是频繁在循环里创建对象。(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是很频繁)

        内存抖动的结果:如果抖动很频繁,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存,而且还是频繁抖动,就可能会需要回收内存以用于产生对象,垃圾回收机制就自然会频繁运行了)

综上就是频繁内存抖动会导致垃圾回收频繁运行。

内存抖动解决办法

        尽量避免在循环体内创建对象,应该把对象创建移到循环体外

        注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象

        当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用

        对于能够复用的对象,可以使用对象池将它们缓存起来

GC回收机制

        通过引用计数器count记录被引用的次数,当每有一次被引用时count+1,当count为0时,此对象被回收

        弊端:当对象A引用了对象B,对象B引用了对象A,出现循环引用,导致两个对象都不会被回收

        GcRoot方式:new一个对象A时会引入一个GCRoot,在对象A的构造方法中new一个B对象,A会引入B,在B的构造方法中new一个C对象,B又引入了C,GCRoot的链形成了,当A置为null时,B对象C对象都会被回收。

垃圾回收算法

        标记清除和标记整理

        标记清除

                首先标记所有可回收的对象,在标记完成后同意回收所有被标记的对象。同时会产生不连续的内存空间,碎片过多会导致以后程序运行时需要分配较大对象时,无法找到足够的连续内存,会更多次的触发GC。

        标记整理

                首先标记可回收的对象,在将存活的对象都向一端移动,然后清理掉边界以外的内存。此方法避免了标记清除算法的碎片问题,同时也避免了法治算法的空间问题。

crash问题

        报错的时间节点往前找

        native异常分析so

        java系统的api例如(handlemessage,activity)之类的,生命周期引起的问题

        oom分析用户使用了哪些功能activity开启了哪些页面,测试复现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/771006.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号