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