问题 如何在Android中收听GC事件


反正我们可以在Android中监控GC事件吗?

在Java中,我相信我们可以听取这些事件 http://www.fasterj.com/articles/gcnotifs.shtml 但是java.lang.management API在Android中不可用。


3718
2017-10-29 17:34


起源

哪个Android运行时? Dalvik还是ART? - AADProgramming


答案:


为什么你想要这个监听器。如果您只是想知道您的应用是否内存不足,请检查以下内容:

当内存变紧时释放内存

在应用程序生命周期的任何阶段,onTrimMemory()回调还会告诉您整个设备内存何时变低。您应该根据onTrimMemory()提供的以下内存级别进一步释放资源:

  • TRIM_MEMORY_RUNNING_MODERATE 您的应用程序正在运行且不被视为可用,但设备内存不足,系统正在主动查杀LRU缓存中的进程。
  • TRIM_MEMORY_RUNNING_LOW 您的应用程序正在运行且不被视为可用,但设备的内存运行速度要低得多,因此您应该释放未使用的资源以提高系统性能(这会直接影响应用程序的性能)。
  • TRIM_MEMORY_RUNNING_CRITICAL 您的应用程序仍在运行,但系统已经杀死了LRU缓存中的大多数进程,因此您应该立即释放所有非关键资源。如果系统无法回收足够数量的RAM,它将清除所有LRU缓存并开始终止系统更喜欢保持活动的进程,例如托管正在运行的服务的进程。 此外,当您的应用程序进程当前被缓存时,您可能会从onTrimMemory()收到以下级别之一:

  • TRIM_MEMORY_BACKGROUND 系统内存不足,您的进程接近LRU列表的开头。虽然您的应用程序进程没有被杀死的高风险,但系统可能已经杀死了LRU缓存中的进程。您应该释放易于恢复的资源,这样您的进程将保留在列表中,并在用户返回应用程序时快速恢复。

  • TRIM_MEMORY_MODERATE 系统内存不足,您的进程接近LRU列表的中间位置。如果系统进一步受限于内存,则您的进程可能会被终止。
  • TRIM_MEMORY_COMPLETE 系统内存不足,如果系统现在没有恢复内存,那么您的进程是第一个被杀死的进程之一。您应该发布对恢复应用状态不重要的所有内容。 由于onTrimMemory()回调是在API级别14中添加的,因此可以使用onLowMemory()回调作为旧版本的回退,这大致相当于TRIM_MEMORY_COMPLETE事件。

这是参考链接 https://developer.android.com/training/articles/memory.html


8
2017-10-29 17:52





好吧,dalvik和艺术都会有所不同。

基本上你可以指示adb shell在跟踪文件中记录GC事件。

艺术: https://source.android.com/devices/tech/dalvik/gc-debug.html

对于art和dalvik来说,它甚至可能是相同的adb命令。

内存监视器工具在android studio中为您显示内存图形图表时会插入此内容。

Progamically,可能更难。看看FB如何执行他们的性能工具,因为我相信他们正在从本机C / C ++端进行GC事件计数,并将它们整理到flatbuffer中,以便他们的Java端分析工具代码可以访问..


3
2017-07-01 13:47