java - 如何分析 Dalvik GC 行为?

标签 java android memory-management dalvik heap-dump

我正在 Android 上开发应用程序。它是一个持续处理传感器数据的长期运行的应用程序。在运行应用程序时,我在 logcat 中看到很多 GC 消息;大约每秒一个。

这很可能是因为对象在循环中被创建并立即取消引用。

如何找到正在创建和立即释放的对象?

我尝试过的所有 Java 堆分析工具 (*) 都对堆上对象的数量和大小感到困扰。虽然它们很有用,但我更感兴趣的是找出创建最多 temporary 短期对象的站点。

(*) 我尝试了 jcatEclipse MAT。我无法得到 hat 来处理 Android 堆转储;它提示转储文件版本不受支持。

最佳答案

How do I find which objects are being created and released immediately?

第 1 步:临时修改您的代码(或使用代码的相关部分创建一个废弃项目),您可以在其中单击一个按钮或其他东西以通过传感器处理逻辑运行一次。

第 2 步:进入 DDMS(独立或 Eclipse 透视图)。

第 3 步:选择您的模拟器,然后单击“分配跟踪器”选项卡

第 4 步:让您的应用程序等待第 1 步中的按钮点击,然后在 DDMS Allocation Tracker 选项卡中点击 Start Tracking。

第 4 步:单击按钮,当传感器处理过程完成后,单击 DDMS 分配跟踪器选项卡上的获取分配。

这将告诉您在该部分代码中分配了什么。它不会告诉您“已释放”的内容是什么,因为在 GC 循环运行之前这是不确定的。

编辑

我不确定,但是 android.os.Debug 类上的 startAllocCounting() 可能与单击 Start Tracking 按钮具有相同的效果。如果是这样,您可以简单地检测您的代码以跟踪一次循环中的分配情况,而不是乱搞我上面概述的代码更改。

并且,FWIW,here is a short technical article关于 DDMS 和分配跟踪。

关于java - 如何分析 Dalvik GC 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538362/

相关文章:

java - 通过Appium在Android操作系统上运行Selenium测试

android - Notepad++ Regex 如何替换字符但仅在双引号之间

c++ - Qt析构函数调用关闭的小部件

c - 如何检查分配给进程中打开文件的内存

c++ - C++中的内存异常

java - Arquillian 可以并行运行测试吗?

java - java中返回泛型类成员的参数化方法

java - Maven Gwt 原型(prototype)错误

java - JSP 读取器/写入器无法正常工作

Android:关于位图、内存使用和缩放的问题