如何在一个简单的应用程序上调试大量内存问题

问题描述 投票:3回答:1

我在我的应用程序中遇到内存问题,我没有找到方法找出哪些对象/类正在使用该内存。

该应用程序很简单,一个视图控制器具有图库的画廊视图(网格视图就像Instagram探索;带有xib单元格的集合视图),当你点击一个时,它会带你到下一个屏幕,这是同一组图像,但作为垂直列表(使用xib单元格的uitableview)。图像是从Web异步下载的。

当我在两个屏幕中滚动时,应用程序使用的内存不断增加,每次打开列表屏幕时也会更快。那么减少使用内存的唯一时刻(我的意思是大幅度地,例如从1.8GB到200MB)是当它达到设备的限制然后问题一次又一次出现时。此外,有时,系统无法减少使用的内存和应用程序崩溃(“由于内存问题终止iOS应用程序”)。

我不认为这是一个布局问题,我已经检查了所有这些,也使用了内存图调试器,只有“malloc”问题发现在那里,我无处可去,没有课,没有线,没有什么。此外,仪器工具太复杂,我不知道如何处理它。

我已经阅读了一些教程并尝试了一些解决方案,但没有任何效果。包括:https://krakendev.io/blog/weak-and-unowned-references-in-swifthttp://iosbrain.com/blog/2018/07/22/finding-memory-leaks-with-the-xcode-memory-graph-debugger-and-fixing-leaks-with-unowned/https://www.youtube.com/watch?v=1LnipXiSrSM&t=1697shttps://developer.apple.com/videos/play/wwdc2018/416/

有人可以给我一些关于如何正确调试内存问题的建议或教程,以便能够找到它们的确切来源吗?

ios xcode memory-leaks xcode-instruments memory-graph-debugger
1个回答
2
投票

大多数现代存储器调试策略适用于识别和解决强参考周期。但这不是你的问题。当您面临内存压力时,大部分内存都会恢复到缓存问题。无论您做什么进一步的诊断,都只能确认这种行为。

要解决这个问题,请为您的缓存设置合理的限制,并避免不提供该控件的缓存(例如UIImage(named:)),问题可能会得到解决。我们无法在不查看图像被检索的情况下进一步评论(例如,确保URLSession的缓存是合理的)以及下载后如何缓存它们(例如,第三方异步图像检索库通常可以控制缓存)。

并且,假设您(或您的第三方库)正在缓存,请确保:

  • 在模拟器上测试您的应用程序,手动选择“调试”»“模拟内存警告”。这将有助于确认应用程序是否响应内存压力。根据你描述的内容,我认为我们已经知道情况就是如此,但这是一个很好的诊断。 请注意,虽然我们总是希望确保我们的应用程序正确响应内存警告,当您遇到内存警告时,可能已经太晚了(例如,应用可能正在进行一系列分配,并且可能会在您的应用有机会之前失败对警告做出反应)。在内存警告发生之前,您希望尽可能地管理缓存。
  • 你正在缓存原始有效载荷(包含压缩的jpg / png资产的Data对象)而不是UIImage对象(一旦它们被使用,它们是未压缩的,如果你不小心可能会很大),或者
  • 如果您确实缓存了UIImage对象,请确保根据您的UI调整它们的大小。 例如,3x比例的100x100图像将占用120kb,但如果图像为1000x1000px,即使图像视图仅为100x100pt,未压缩图像将占用4mb,即每像素4个字节,无论压缩jpg / png有效负载的大小如何。
  • 如果您使用的是NSCache,请设置countLimittotalCostLimit
  • 如果您正在处理下载图像的自己的集合(数组或字典),请确保您对内存压力做出响应。例如,在Swift中: NotificationCenter.default.addObserver(forName: UIApplication.didReceiveMemoryWarningNotification, object: nil, queue: .main) { [weak self] _ in // do whatever you need to remove your cached objects here } 我不认为这是问题(因为你的应用程序正在响应内存压力),但你可能想要检查你的应用程序是否有(a)很大的其他内容; (b)您自己下载并记忆,并做出相应的回应。

FWIW,我认为你已经做了足够的诊断来确定问题的根源(它在内存压力下被清除的事实确实指向了缓存问题),但是如果你想学习仪器中的“Allocations”工具,请检查这些旧的WWDC视频Fixing memory issuesiOS App Performance: Memory。它们已经过时并且专注于Objective-C,但如果您想要快速掌握仪器,那么其中概述的技术仍然适用。但是,就像我说的那样,我认为你已经确定了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.