【问题标题】:Allocations instrument tool in Swift not providing detailed enough informationSwift 中的分配工具工具没有提供足够详细的信息
【发布时间】:2016-06-16 20:20:51
【问题描述】:

我正在尝试使用分配工具来分析 Swift 2 iOS 应用程序。我这样做是这样的:

  1. 使用分配工具运行应用程序。
  2. 应用启动后,我等待 10 秒,然后点击“Mark generation”
  3. 我打开我怀疑有内存泄漏的屏幕,等待 10 秒,关闭它,再等一会儿,然后点击“标记代数”

此时,我查看第二代以查看从未发布过的对象。我的麻烦是最大的罪犯总是只是“main”,它没有指向任何特定的类或方法

如上所示,“main”导致了几乎 80% 的内存泄漏,但堆栈跟踪并不指向任何特定的地方,不像它下面的泄漏指向特定的方法。

我不确定这是否相关,但是当我转到文件 -> 符号时,我显示了一个缺失的符号,就像这样。但是,我在机器上的任何地方都找不到这个符号:

我的问题是:这个“main”持有这么多内存是正常的,还是我端的某些配置错误导致我无法看到真正的堆栈跟踪?

【问题讨论】:

  • 由于您正在处理一个具有完全机密标识符的完全机密项目,因此您应该按照 SO 规则的要求创建一个最小项目。否则膏药的数量让我觉得你的代码很糟糕。
  • 为什么知道我的项目名称会帮助您解决我的问题?
  • 如我所说,你花在膏药上的时间应该投入到创建一个最小的项目上。
  • 你花在批评我的膏药上的时间应该花在回答我的问题上。
  • 我绝对不会回答你的问题。你似乎忘记了提问者是谁。

标签: ios swift instruments


【解决方案1】:

所以有几件事需要考虑。

1:要了解哪些对象已分配然后从未释放,您应该考虑使用分配摘要而不是代数。要查找“分配摘要”,请查看“详细信息”按钮旁边的“世代”。单击世代,然后切换到统计。然后在搜索栏中输入您的应用程序的名称(在我的情况下为 Fleet.),Instruments 将过滤分配给您创建的对象。请参阅下面的屏幕外观示例。

现在,要确定对象是否未被释放,您需要查看 Persistent 和 Transient 列。 Persistent 列显示当前存在的对象数,而 Transient 列显示已存在但已被释放的对象数。因此,如果您希望一个对象被解除分配,但 Transient 列中的数字没有改变,那么您就知道该对象没有被解除分配并且您遇到了问题!

2:如果您仍想使用 Generations 来确定是什么占用了所有内存,您可以取消选中 Invert Call Tree & Hide System Libraries 选项。例如,在我的屏幕上(如下所示),您会看到 main 占用了 A 代分配的内存的 76.5%。深入研究我可以发现大部分分配(45.2%)都分配给了 UIImages。

有关 Instruments 的更多详细信息和精彩教程,请参阅: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

希望这会有所帮助! ?

【讨论】:

  • 嗨,理查德。我会接受你的回答,谢谢。我认为我看到的主要区别是您可以深入了解占 76% 的“主要”分配,而我不是(它对我来说不可点击)。在您的示例中,您是否会解决/修复 UIImages 正在使用这么多内存的事实,或者您是否考虑系统功能的那部分并留下它?
  • 我认为您无法深入了解主要分配的原因是您已检查的选项。如果取消选中 Invert Call Tree & Hide System Libraries 选项,“main”应该变成可点击的。
  • 关于你的第二个问题。 76% 并不意味着正在使用大量内存。使用的总内存位于百分比左侧的字节列中。 (我的是 25.83 MB,你的是 3.21 MB)76% 只是总数的百分比。所以在你的情况下你应该没问题,虽然内存使用肯定是你想看的。
【解决方案2】:

总结上面的讨论,“main”无法点击进入的原因是因为选择了“invert call tr​​ee”选项。取消选中“反转调用树”可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2019-06-04
    • 2016-12-07
    相关资源
    最近更新 更多