Android性能优化之修复游戏中内存泄漏(java层)

这篇具有很好参考价值的文章主要介绍了Android性能优化之修复游戏中内存泄漏(java层)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

游戏在bugly上内存OOM越来越严重,因此,近期对内存进行优化。从java层的内存进行优化开始,通过LeakCannary或者adb shell 获取到内存快照,发现好几处内存泄漏点。

1.单例类持有Activity:

Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
查看内存快照,该闪屏页面Activity(包含引用对象)可回收3.8M的内存;
LeakCannary的内存分析也证明了该对象占用的内存大小,持有1380对象。
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
持有关系:
context.getContentResolver()注册ContentObserver-->Activity的匿名内部类Listener -->splashActivity。
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
解决方式:将匿名外部类,设置外部类或者挪动到其他类中设置。
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java

2.屏幕方向导致Activity被持有

WXPayEntryActivity的屏幕选择导致的内存泄漏:
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java查看ActivityThread中源码:
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
接着继续,看下是什么情况下会调用:
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
打开微信是竖屏显示,而游戏是横屏显示,因此当微信界面关闭后,会到游戏进程中创建Activity时,需调整屏幕,会调用 overrideApplicationDisplayAdjustments()矫正。
接着查看,手机系统,发现屏幕设置是自动旋转。
再来查看下WXPayEntryActivit的屏幕配置是默认:
Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
解决方式:加上android:screenOrientation="sensorLandscape"

Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java

3.Activity作为context被系统类持有

Android性能优化之修复游戏中内存泄漏(java层),Android性能优化,android,游戏,java
在广告页面的Activity 被GestureBoostManager持有,解决方案,是使用Appliction 作为context 去获取系统类。文章来源地址https://www.toymoban.com/news/detail-608147.html

建议:

  • 尽量避免持有Activity ,尽量使用Application(除开dialog外);
  • 使用Acitivity中使用 匿名内部类(避免:new Listener)等,在Ondestory()中要移除,避免匿名内部类持有Activity导致内存泄漏
  • 避免将Activity有关的属性或者持有的activity的对象设置成static ,避免造成内存泄漏;

到了这里,关于Android性能优化之修复游戏中内存泄漏(java层)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(34)
  • Android之内存泄漏与内存溢出

    内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存

    2024年02月13日
    浏览(36)
  • Android 内存泄漏

    内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象,虽然Java有垃圾回收机制(GC),但是对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们。 内存溢出:即out of memory, 当你要求分配的内存超过了系统给你

    2024年02月08日
    浏览(26)
  • Android内存泄漏分析及检测工具LeakCanary简介,Android进阶

    @Synchronized override fun expectWeaklyReachable( watchedObject: Any, description: String ) { if (!isEnabled()) { return } removeWeaklyReachableObjects() val key = UUID.randomUUID() .toString() val watchUptimeMillis = clock.uptimeMillis() val reference = KeyedWeakReference(watchedObject, key, description, watchUptimeMillis, queue) SharkLog.d { \\\"Watching \\\" +

    2024年04月25日
    浏览(27)
  • android 如何进行内存泄漏检测及解决方法

    内存泄漏是在Android开发中常见的问题之一,它可能导致应用的内存占用逐渐增加,最终影响应用的性能和稳定性。以下是一些常见的方法来进行内存泄漏检测和解决: 1. 使用工具进行内存泄漏检测: Android Profiler: Android Studio提供的Android Profiler工具可以帮助您监视应用的内

    2024年02月07日
    浏览(37)
  • 【Android】一个contentResolver引起的内存泄漏问题分析

    长时间的压力测试后,系统发生了重启,报错log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912   973  3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014   973  3243 F z

    2024年02月08日
    浏览(30)
  • Android 内存泄漏的常见原因及其对应的解决方案

    Android应用程序中常见的内存泄漏原因有很多,以下是一些常见的原因及对应的解决方案: 1. 静态引用导致的内存泄漏: 静态变量持有对Activity或Fragment的引用,导致它们无法被垃圾回收机制释放。 解决方案: 确保不将Activity或Fragment的实例赋值给静态变量。如果确实需要使用

    2024年02月08日
    浏览(37)
  • Android 源码浅析:Leakcanary 内存泄漏检测的好帮手

    我们一起来分析一下大名鼎鼎的 Leakcanary, 想必作为 Android 开发都多多少少接触过,新版本的 Leakcanary 也用 Kotlin 重写了一遍,最近详细查看了下源码,分享一下。 tips:本来是只想分析下内存泄漏检测部分,但写着写着就跑偏了,因为内存泄漏的检测难点在于对对象生命周期

    2024年02月02日
    浏览(31)
  • Android TextView动态地加载资源文件,避免Native 层内存泄漏或内存溢出

    在 Android 中,如果使用 TextView 的 setBackgroundResource() 方法设置背景,可能会导致 Native 层内存增长。这是因为 setBackgroundResource() 方法会将资源文件(例如图片)加载到内存中,如果频繁地调用该方法,就会导致内存泄漏或内存溢出。 为了避免这种问题,可以使用 TextView 的 s

    2024年02月09日
    浏览(29)
  • Android性能优化之游戏收敛线程,减少OOM发生(epic 检测线程调用/booster减少常驻线程超时销毁)

    先来了解下一个空白app的进程中线程数量 : 分析迷你世界中app线程之前,先来了解下空白app ,中线程情况: 一个空白app的线程大概是27个: 一个空白的的app,包含FinalizerDaemon线程、FinalizerWatchd线程、RenderThread、主线程、ReferenceQueued、HeapTaskDaemon、SignalCatcher、GCDaemon、hwuiTa

    2024年02月14日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包