Android堆碎片策略?

2023-11-27

我有一个 OpenGL Android 应用程序,它使用大量内存来设置复杂的场景,这显然会导致严重的堆碎片。即使不存在内存泄漏,也不可能在不因碎片而耗尽内存的情况下销毁和创建应用程序。 (碎片肯定是问题,而不是泄漏)

这会导致一个主要问题,因为 Android 习惯于在同一个 VM/堆上销毁和创建 Activity,这显然会导致 Activity 崩溃。作为应对这一问题的策略,我使用了以下技术:

@Override
protected void onStop() {
    super.onStop();
    if(isFinishing()) {
        System.runFinalizersOnExit(true);
        System.exit(0);
    }
}

这确保了当活动完成时,它会导致虚拟机完全关闭,因此下次活动启动时,它会获得一个新的未碎片的堆。

注意:我意识到这不是“Android 方式”,但鉴于垃圾收集器是非压缩的,因此不可能连续重用堆。

这种技术实际上在一般情况下确实有效,但是当活动在非完成模式下被销毁然后重新创建时,它就不起作用了。

有人对如何处理堆的退化有什么好的建议吗?

进一步注意:减少内存消耗也不是真正的选择。该活动实际上并没有使用那么多内存,但堆(和本机堆)似乎很容易碎片化,可能是由于一些大的内存块


碎片几乎总是不良分配模式的结果。大型对象经常被创建和销毁。与可能持续存在的较小对象(或至少具有不同的生命周期)结合在一起,会在堆中创建空洞。

在这种情况下,唯一有效的碎片预防方法是:阻止特定的分配模式。这通常可以通过合并大型对象来完成。如果成功,应用程序将庆幸地以更快的执行速度承认这一点。

@编辑:更具体地回答你的问题:如果应用程序重新启动后堆还不为空,那么堆上还剩下什么?您确认这不是内存泄漏的问题,但这就是看起来的问题。由于您正在使用 OpenGL - 是否有可能一些本机包装器幸存下来,因为 OpenGL 资源尚未正确处置?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android堆碎片策略? 的相关文章

  • 如何在红米手机上通过应用程序图标显示徽章数量?

    我可以使用以下代码在三星设备上使用应用程序图标显示徽章计数
  • WifiConfiguration 在 Lollipop 中启用网络

    我正在研究 Wifi 项目 有一个模块可以让用户以编程方式加入 wifi 在 kitkat 及以下版本中它可以成功工作 但在 Lollipop 中它不起作用 这是代码 WifiManager wifiManager WifiManager
  • Parcelable 写入可序列化对象 getactivity() 时遇到 IOException

    所以我在 logcat 中得到了这个 java lang RuntimeException Parcelable encountered IOException writing serializable object name com re
  • 如何设置itemTouchHelper选择性滑动?

    所以我在 recyclerview rv 上实现了这个 itemtouchhelper simple 回调 现在 在这个 rv 中 我根据内容类型将 2 种布局设置为一行 因此 当我在 rv 上设置此 touchhelper 时 它正在这两
  • 应用程序启动时立即隐藏导航栏

    基于以下代码片段 我能够隐藏状态栏当应用程序启动时 但不是导航栏 由后退 主页和任务管理器按钮组成的栏 因为它隐藏了稍后在 MainActivity 的线程完成加载后 这是清单
  • 如何以编程方式从 mipmap 文件夹加载图像? [复制]

    这个问题在这里已经有答案了 如何从 加载图像mipmap以编程方式保存文件夹 与可绘制对象一样 img setImageResource imageId 我使用的是Android Studio 1 2 1 In 安卓工作室我们有mipmap
  • Gson.toString() 给出错误“IllegalArgumentException:多个名为 mPaint 的 JSON 字段”

    我想将自定义对象转换为字符串并保存在 SharedPreferences 中 这是我的最终目标 我尝试了下面的行但失败了 String matchString gson toJson userMatches Logcat 10 11 15
  • API 31 上是否有官方方法来提供文件关联,可能使用 pathSuffix/pathAdvancedPattern?

    背景 现代桌面操作系统上的一个众所周知的功能是能够处理文件 允许用户从文件管理器和其他应用程序中打开它们 作为 文件关联 配置 问题 到目前为止 对于用户和开发人员来说 在 Android 上设置文件类型关联并不是一件很方便的事情 在 An
  • Android 中的 XmlPullParser 陷入困境

    经过多个小时的搜索和调试后 我仍然停留在同一个地方 并且 Eclipse 没有帮助我 我试图解析这个 RSS 提要 http fr espnf1 com rss motorsport story feeds 0 xml type 2 这很简
  • 使用 appcelerator titan 在 android 中后退按钮退出应用程序

    我是钛开发的新手 在本机 android 中 如果我们按下后退按钮 则仅当前活动将被关闭 并且它将返回到上一个活动 但是当我使用 Titanium 在 Android 中按下后退按钮时 它会从应用程序退出 我怎样才能改变这种行为 有两种类型
  • Android 可检查子菜单选项

    所以我有一个用于选项菜单项的子菜单 我想要一个可检查条目的列表 用户可以根据需要选择 取消选择多个条目 我无法解决的唯一问题是如何防止单击其中一个复选框时关闭选项菜单 我看到 PerformShortcut 有一个 FLAG PERFORM
  • 如何设置上拉刷新SwipeRefreshLayout

    我看到很多 ListView 下拉刷新的库 但是当从上到下拉动时它们是工作的 但是从下到上拉动时我如何刷新 我可以用这个做吗滑动刷新布局 http developer android com reference android suppor
  • 创建用于 Android 库分发的 JAR

    我正在开发一个 android 库 并希望导出一个 JAR 文件 我可以分发该文件供其他人在他们的应用程序中使用 我不想分发源代码 因为它包含有关发布到我的网络服务器的详细信息 我尝试使用在 bin 目录中创建的 JAR 文件并将该 jar
  • 在 Android 5 上支持 BLE 外设角色的芯片组 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Android 5 0 Lollipop 引入的新 BLE 外设模式将不会在 Nexus 4 5 或 7 上启用 https code
  • Android 连接有时会被拒绝(并非所有时候)

    我编写了一个 WiFi Direct 代码连接并在它们之间创建了一个连接 然后我创建了一个ServerSocket在第一面和一个Socket在客户端并开始在它们之间发送数据 第一次启动应用程序时它工作成功 但是当我关闭应用程序并再次启动它时
  • 未调用内容提供商 query() (Android TV)

    据报道 我正在尝试将我的应用程序纳入 Android TV 全局搜索中文档 http developer android com training tv discovery searchable html我必须创建以下内容 内容提供商 可搜
  • 上次更新arm64-v8a后,模拟器在M1 Mac上显示离线

    昨天模拟器运行得很好 系统镜像为arm64 v8a 我不太记得工作系统映像的版本名称 但是昨天我接受了 ARM 64 系统映像的更新 版本名称是 S 我可以从 AVD 管理器启动模拟器 当我按 运行应用程序 按钮时模拟器也会启动 但是 该应
  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署

随机推荐

  • 如何通过深层链接恢复 Android 应用程序而不丢失活动堆栈(或应用程序状态)?

    我有这个
  • 如何从 SSE2 __m128i 结构中提取字节?

    我是 SIMD 内在函数的初学者 所以我要感谢大家的耐心等待 我有一个涉及无符号字节的绝对差异比较的应用程序 我正在处理灰度图像 我尝试了 AVX 更现代的 SSE 版本等 但最终认为 SSE2 似乎足够了 并且对单个字节的支持最多 如果我
  • 身份验证后读取数据时 Firebase 权限被拒绝

    我是 Firebase 新手 我使用电子邮件和密码对用户进行了身份验证 final Firebase ref new Firebase https app firebaseio com ref authWithPassword email
  • C++:宽字符输出不正确?

    我的代码基本上是这样的 wstring japan L 日本 wstring message L Welcome Japan is message japan wprintf message c str 我希望使用宽字符串 但我不知道它们是
  • Laravel Carbon 按月分组

    谁能看到我做错了什么吗 我试图输出所有月份 但将它们分组 以便它们是唯一的 months NewsItem select DB raw MONTH created at as month gt groupBy month gt get re
  • 为什么每次重新启动应用程序时,我的蓝牙设备的地址都会发生变化?

    我正在使用这个对 Android 的蓝牙 LE 功能进行一些简单的扫描 广告测试示例代码 我正在使用三星 6 和 Nexus 9 进行测试 出于某种原因 如果我让应用程序在三星上运行并在 Nexus 上重新启动应用程序 则下次三星设备找到其
  • 实例化 Injectable 类时未调用 ngOnInit

    为什么不是ngOnInit 当Injectable类解决了吗 Code import Injectable OnInit from angular2 core import RestApiService RestRequest from r
  • WordPress 将“&&”更改为“&&”

    我正在使用PHPinclude 函数来包含静态PHP and JS我的 WordPress 页面中的内容 通过 ezPHP 插件实现 PHP 工作正常 但 JS 不行 我收到 非法字符 错误 每个实例 正在更改为 html 代码 我尝试将其
  • 如何判断您要从 WinForms 选项卡控件中移动到哪个选项卡?

    我需要确定用户在切换选项卡时来自和前往哪个选项卡 并可能取消切换 我尝试过取消选择 取消选择 选择 选定事件 所有这些事件都显示 e TabPageIndex 与 sender SelectedIndex 相同 是否有一个事件或属性可供我使
  • 类型擦除:Java 与 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 与 Java 泛型 Java use 类型擦除 while C 在运行时保留类型信息 该设计的语言行为有何实际差异 类型擦除存在很多问题 它勾起了不好的回忆 我从 1 6 开始就没有使用过 Jav
  • WebRTC的RTCDataChannel在iOS中的实现

    我在用ISBX apprtc ios视频聊天实现代码 这在 iPhone 和模拟器中完美运行 我想在两个对等点之间发送文本 字符串数据 并且我正在使用RTCDataChannel class 以下是我的实现 我无法建立连接 它总是给出状态k
  • 如何在不使用代码的情况下使用约束 AutoLayout 来指定横向与纵向的不同布局?

    我有一个带有登录屏幕的 iPad 应用程序 登录控件包含在 UIView 中 当 iPad 处于纵向方向时 我的登录 UIView 靠近应用程序的底部和中心 几乎就在键盘所在位置的正上方 公司徽标位于顶部居中的 UIImageView 中
  • ASP.NET MVC 4应用程序调用远程WebAPI

    我过去创建过几个 ASP NET MVC 应用程序 但以前从未使用过 WebAPI 我想知道如何创建一个简单的 MVC 4 应用程序 通过 WebAPI 而不是通过普通的 MVC 控制器来执行简单的 CRUD 操作 诀窍在于 WebAPI
  • Sharepoint API - 如何从 ASP.NET Web 应用程序将文件上传到 Sharepoint 文档库

    我是 Sharepoint Server 的新手 我们有任何实用程序可以从 ASP NET 应用程序上传文件吗 您能提供您宝贵的答案吗 您可以编写一些自定义代码来执行此操作 如果您位于同一服务器上或使用 Web 服务 则可以使用 Share
  • 是否可以转换参数包中的类型?

    是否可以转换参数包的类型并传递 例如 鉴于以下情况 template
  • 不存在具有键“xxx”的“IEnumerable”类型的 ViewData 项

    Stack Overflow 上有几篇关于此问题的帖子 但没有一个答案似乎可以解决我当前情况下的问题 我有一个页面 其中有一个表格 每行都有多个文本字段和一个下拉列表 所有下拉列表都需要使用相同的 SelectList 数据 因此我将其设置
  • 在共享主机上为 32 位 Linux 编译 git

    我需要在廉价的共享主机上设置 Git 客户端 并使用一个不知名的 32 位 Linux 发行版 GCC 不可用 所以我无法在服务器上编译它 我确实有两台其他 64 位 Linux 服务器和一台 OSX 笔记本电脑可供使用 我可以尝试在其上交
  • Gnuplot,如何*跳过*丢失的数据文件?

    根据各种因素 我可能没有 1 个或多个不存在的数据文件 在预定义的 gnuplot 绘图指令中引用 当这种情况我得到 警告 跳过不可读的文件 这会取消其余指令 有什么方法可以让 gnuplot 跳过任何丢失的数据文件并绘制所有现有的数据文件
  • 为什么我收到“错误:无法推送某些参考”?

    我有一个远程 git 存储库和一个我使用的本地存储库 每当我在本地进行任何更改时 我都会将它们推送到远程 然后我有时会在远程文件上执行 git commit 以存储远程文件上的更改 我根本不直接编辑远程存储库 我只是提交更改 我是一名单一开
  • Android堆碎片策略?

    我有一个 OpenGL Android 应用程序 它使用大量内存来设置复杂的场景 这显然会导致严重的堆碎片 即使不存在内存泄漏 也不可能在不因碎片而耗尽内存的情况下销毁和创建应用程序 碎片肯定是问题 而不是泄漏 这会导致一个主要问题 因为