【问题标题】:How to listen to GC events in Android如何在 Android 中监听 GC 事件
【发布时间】:2014-10-29 17:34:33
【问题描述】:

我们是否可以在 Android 中监控 GC 事件?

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

【问题讨论】:

  • 适用于哪个 Android 运行时?达尔维克还是艺术?

标签: java android garbage-collection


【解决方案1】:

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

当内存变紧时释放内存

在应用程序生命周期的任何阶段,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

【讨论】:

    【解决方案2】:

    好的,dalvik 和 art 会有所不同..

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

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

    art 和 dalvik 甚至可能是相同的 adb 命令。

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

    在程序上,可能更难..看看 FB 如何使用他们的性能工具,因为我相信他们正在从本机 C/C++ 端进行 GC 事件计数,并将它们整理到一个平面缓冲区中,以便他们的 java 端分析工具代码访问..

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多