【问题标题】:occupied memory increased continuously, but no memory leak占用内存不断增加,但没有内存泄漏
【发布时间】:2019-11-11 01:03:34
【问题描述】:

我开发了一个应用程序来从网站下载网页。 对于庞大的网站,它会运行很长时间。 我注意到占用内存不断增加(下载2600个网页后从30M增加到300M),但Instrument中没有任何内存泄漏。

下载3648个网页后,其信息

我停止下载程序后,占用的内存不会因为内存释放而减少。

我更改所有代码

[NSString stringWithFormat:@"someThing"];

到

[[NSString alloc] initWithFormat:@"someThing"];

一点改善,占用内存下降到300m

欢迎您的评论

【问题讨论】:

  • Rob Napier 是对的,您应该关注“持久”数字,而不是瞬态或“总”数字,其中包括已释放的内存。您的持久数字看起来不错。
  • 顺便说一句,您似乎非常重视没有任何报告的泄漏。不幸的是,这仅涵盖了潜在问题的一小部分。困扰我们项目的最常见的内存问题是强引用循环(也称为保留循环),并且这些问题不会被报告为泄漏。见How to debug memory leaks when Leaks instrument does not show them? 但是,同样,除非“持续”数字增加,否则不要担心。

标签: ios objective-c cocoa-touch instruments


【解决方案1】:

此图表是分配的总数,而不是当前的内存使用情况。 “持久”列(尚未释放的分配)大约为 40MB。它告诉你的是,你已经在不同的时间分配了大约 5.68GB 的​​数据并释放了几乎所有的数据。这就是为什么红色条几乎完全是淡红色,左侧只有一点点纯红色。

这表明可能有一些方法可以通过重用更多内存而不是分配和释放内存来提高性能(这非常耗时)。或者也许通过避免不必要的临时分配。但是,如果您没有遇到性能问题,那么这里就没有实际问题。

【讨论】:

  • 更新问题,下载3648个网页后占用内存高达1.4 GB,即使我停止下载,占用内存也不会因为释放而下降
  • 您在此处发布的内容对调试内存问题没有帮助;您刚刚发布了总分配(其中大部分已释放)。您的示例以“我更改所有代码”开头的意思也很不清楚。使用量是否会从 1.4GB 下降到 300MB?还是你的意思是别的?一开始,您需要深入了解 Instruments 中的内存图,并查看哪种类型的分配正在使用您的大部分持久(非瞬态)内存。您的屏幕截图对此没有帮助。探索时查看右侧的堆栈跟踪。
  • 使用[NSString stringWithFormat:@"someThing"]; 非常浪费(它相当于非常便宜的@"someThing"),但您的问题不清楚您是指静态字符串上的stringWithFormat:,还是其他意思.仔细阅读您的问题并思考“仅考虑问题中的信息,我将如何回答这个问题?”如果在stringWith 和initWith 表单之间切换会对您的高水位标记产生很大影响(但内存会在稍后恢复),那么您可能有一个自动释放池,您并没有耗尽。
  • 1.4G不重要,我只想说占用内存涨到0.4或者1.4GB,即使我停止下载(按停止键),占用内存也不会下降在没有任何内存泄漏的情况下按预期释放
  • 可能是因为您将其保留在某处。也许是故意的。也许在您不知道的系统缓存中(这是可清除的内存并且不相关)。您不必为了增加内存使用而发生泄漏;你也可以继续存储东西。但是如果你有内存问题,那么上面的 cmets 讨论如何调试它。总(主要是临时)分配的快照不能帮助我们帮助您。同样,仅显示“1.41GB”的快照并不能帮助我们帮助您。
猜你喜欢
  • 2011-01-21
  • 2011-05-03
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多