【问题标题】:What is the "total count" metric in Android Studio's Memory Profiler?Android Studio Memory Profiler 中的“总计数”指标是什么?
【发布时间】:2019-06-09 17:16:35
【问题描述】:

我在 Android 开发者文档的任何地方都找不到该指标的描述。这是我最近查看的链接:https://developer.android.com/studio/profile/memory-profiler

这是我的想法:堆中尚未释放的对象数量。

如果可能,请提供支持您推理的可靠资源(例如,YouTube 上的 Google I/0 演讲,带有分钟标记或一些 Android 文档)。

编辑:这是包含指标的屏幕截图。

【问题讨论】:

  • 能否用截图补充问题?
  • 按要求添加屏幕截图。

标签: android-studio memory memory-management memory-leaks heap-memory


【解决方案1】:

总计数列

Total Count 定义为对象总数(见Android Studio source),具体如下:

  new AttributeColumn<>(
    "Total Count",
    () -> new SimpleColumnRenderer<ClassifierSet>(
      value -> Integer.toString(value.getAdapter().getTotalObjectCount()),
      value -> null,
      SwingConstants.RIGHT),

这个getTotalObjectCount()is defined as

  public int getTotalObjectCount() {
    return mySnapshotObjectCount + myDeltaAllocations - myDeltaDeallocations;
  }

递增方法

mySnapshotObjectCount 的值在 addSnapshotInstanceObject 内部递增,其中包含有用的注释:

将实例添加到基线快照并更新记帐 “总”值。

myDeltaAllocationsmyDeltaDeallocations 值递增 inside addDeltaInstanceInformation

if (isAllocation) {
  myDeltaAllocations++;
}
else {
  myDeltaDeallocations++;
}

这称为inside partition,其中包含有用的评论:

根据当前的ClassifierSet 策略在snapshotInstancesmyDeltaInstances 中划分InstanceObjects。这将消耗输入中的实例。

snapshotInstance 与用于递增mySnapshotInstanceObjectCount 的值相同,因此表明所有 3 个值都非常紧密地联系在一起,是在创建分区(快照)时创建的,并且所有因素都计入总计数。


最终公式

所以,最终的答案是:

Total Count = Snapshot objects + New allocations - New deallocations
  • 快照对象 = 在快照之前分配的对象实例数。
  • 新分配 = 快照期间的分配数。
  • 新解除分配 = 快照期间解除分配的次数。

该等式的定义与 Axifive 在另一个答案和链接视频中所述的内容相匹配。

【讨论】:

  • 出色的工作!您能否在答案中提供Snapshot objectsNew allocationsNew deallocations 的源代码支持的解释?我相信你已经完成了你的研究,但是当涉及到像你这样的源代码支持的答案时,我想留下一个完整的、迂腐的书面证明,我不相信自己能够完全理解我自己的源代码。
  • @GrantPark 当然。我已经添加了关于所有 3 个如何递增的信息,以及它们之间的连接。如果我走得更远,我担心我只会逐行解释代码,但让我知道任何其他需要改进的领域!感谢您的建议。
  • 所以查看这些方法的调用位置以及相关的 cmets 很有帮助,但我想知道这些项目是如何计算的,例如snapshot objects 计数是否包含快照之前对象的释放计数?话虽如此,我衷心感谢您花时间研究分析器源代码——考虑到没有适当的文档,这是一个强有力的答案。
  • 据我所知,这只是对象的数量(因此不包括分配/解除分配),但对包含在答案中的信心不足。等我下班回来再看看!
【解决方案2】:

这就是我的想法:堆中拥有的对象数量 没有被释放。

您的想法是对的,但我不能为此提供公共线程。

【讨论】:

    【解决方案3】:

    是的,这是在所选周期之前分配的实例总数+所选周期的内存分配(或者如您所说:堆中尚未为所选周期释放的对象(实例)数期间)

    你可以看到这个here

    在 Instance View 上,可以看到三个int 数组在 1m 处被分配,但没有被释放(在选定的时间段内)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-17
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多