Android服务占用大量内存
Android Service taking up huge amount of memory
我的应用程序是这样工作的:
Launcher activity 在前台启动一项服务,该服务监视剪贴板更改并在每次复制特定类型的字符串时启动 Launcher activity。我是 Java 编程的新手,我尝试使用应用程序中的所有最佳实践(使用工作线程并防止 UI 线程打嗝),到目前为止一切都很顺利。问题是 RAM 消耗,在应用程序重新启动时(服务启动后)应用程序报告 android 运行 进程中的 24M 内存消耗。这是错误行为所在:
- Android Studio 中的内存监视器报告了其他内容
- adb shell dumpsys meminfo mypackage
命令也是如此
已附上两者的截图
这些行为对我来说是无法理解的。 50M 是很大的 RAM。此外,每当服务启动 Launcher activity 时,应用程序消耗的内存比它已经使用的内存多大约 1M。谁能帮我调试这个?
谢谢
将堆转储保存为 HPROF 文件并将其转换为 Java Profiler 可以读取的扩展名
然后你就可以看到是什么占用了这么多内存
问题可能是 Android 如何处理服务和
同一申请流程中的活动 运行:
只要一个(启动的)服务在运行进程中,“内存
整个过程的“优先级” is elevated 高于其他过程
只有 运行(背景)活动。
但是,由于活动
are never recycled by Android 即使在内存压力下(与
some statements 在官方文档中),
这有效地使您的 Activity 存活的时间比必要的要长得多。这本质上是一个 shortcoming of Android's process model.
如果您的内存使用量在您强制终止您的应用程序进程(并且 Android 随后重新启动您的服务)后下降到几兆字节,或者如果内存使用量因您是否离开 activity 按主页或后退按钮,确认您正面临此问题。
如果您确实在后台持续 运行 依赖您的服务并希望最大限度地减少内存使用,您可以尝试将其移动到它自己的进程(内存密集型 UI 资源,如永远不会加载活动中的视图)。
当然,这也增加了开销;保持实施原样可能会更好。 Android 仍然会在内存压力下终止您的进程,稍后会重新启动您的服务(但不是您的活动),这将在没有任何干预的情况下最大限度地减少您的内存使用量。
我的应用程序是这样工作的: Launcher activity 在前台启动一项服务,该服务监视剪贴板更改并在每次复制特定类型的字符串时启动 Launcher activity。我是 Java 编程的新手,我尝试使用应用程序中的所有最佳实践(使用工作线程并防止 UI 线程打嗝),到目前为止一切都很顺利。问题是 RAM 消耗,在应用程序重新启动时(服务启动后)应用程序报告 android 运行 进程中的 24M 内存消耗。这是错误行为所在:
-adb shell dumpsys meminfo mypackage
命令也是如此
已附上两者的截图
这些行为对我来说是无法理解的。 50M 是很大的 RAM。此外,每当服务启动 Launcher activity 时,应用程序消耗的内存比它已经使用的内存多大约 1M。谁能帮我调试这个? 谢谢
将堆转储保存为 HPROF 文件并将其转换为 Java Profiler 可以读取的扩展名
然后你就可以看到是什么占用了这么多内存
问题可能是 Android 如何处理服务和 同一申请流程中的活动 运行:
只要一个(启动的)服务在运行进程中,“内存 整个过程的“优先级” is elevated 高于其他过程 只有 运行(背景)活动。
但是,由于活动 are never recycled by Android 即使在内存压力下(与 some statements 在官方文档中), 这有效地使您的 Activity 存活的时间比必要的要长得多。这本质上是一个 shortcoming of Android's process model.
如果您的内存使用量在您强制终止您的应用程序进程(并且 Android 随后重新启动您的服务)后下降到几兆字节,或者如果内存使用量因您是否离开 activity 按主页或后退按钮,确认您正面临此问题。
如果您确实在后台持续 运行 依赖您的服务并希望最大限度地减少内存使用,您可以尝试将其移动到它自己的进程(内存密集型 UI 资源,如永远不会加载活动中的视图)。
当然,这也增加了开销;保持实施原样可能会更好。 Android 仍然会在内存压力下终止您的进程,稍后会重新启动您的服务(但不是您的活动),这将在没有任何干预的情况下最大限度地减少您的内存使用量。