今天这篇文章主要介绍内存相关的知识点,以及那些因素会导致OOM崩溃和相对应的解决方案,所以通过这篇文章你将学习到以下内容:
什么是虚拟内存和物理内存
32位和64位设备可用虚拟内存分别是多少
为什么虚拟内存不足主要发生在32位的设备上
如何解决虚拟内存不足的问题
App启动完成之后,虚拟内存的分布
如何解决Java堆内存不足的问题
Java堆上还有很多可用的内存,为什么还会出现OOM
做性能优化时,需要关心那些指标数据
不知道小伙伴们有没有经历过,相同的优化方案,A应用上线之后,崩溃率下降很多,但是B应用上线只有一点点收益,每个优化方案,在不同的App上所得到的优化效果未必一样,因为每个App在不同的国家和地区面对的用户群体不一样,因此机型也都不一样,所以我们需要了解内存相关的知识点,结合线上和线下数据,对自己的App进行归因,对症下药,才能取得较大的收益。
内存是极其稀缺的资源,不合理的使用会导致可用内存越来越少,可能会引发卡顿、ANR、OOM崩溃、Native崩溃等等,严重影响用户的体验。所以当我们在做性能优化的时候,内存优化是非常重要的环节。
初期在做内存优化的时候,在我们的脑海里都会有一个潜意识「内存占用越少越好」,在某些情况下是不对的。例如在高端机上我们可以多分配点内存,可以提升用户的体验,但是在低端机上内存本身就很小,所以我们应尽量减少内存的分配。例如针对损耗性能的动画、特效等等,在低端机上是不是可以关掉,或者关掉硬件加速、采用其他的方案代替,这样不仅可以减少崩溃,还可以减少卡顿,提高用户体验。
因为Java有自动回收机制,所以在开发过程中,很少有人会去关心内存问题,在脑海中都会有一个潜意识GC会自动回收,所以用完不会主动释放掉无用资源例如Bitmap、动画、播放器等等,等待GC来回收,在实际项目中,依赖GC是不可靠的。首先GC自动回收机制具有不确定性,GC也分为了不同的类型,如果发生FullGC时,会触发stoptheworld事件,会使App变得更加严重。