gpt4 book ai didi

ios - 如何避免 iOS 中的堆碎片

转载 作者:可可西里 更新时间:2023-11-01 03:14:52 25 4
gpt4 key购买 nike

我们的应用程序在运行时会创建很多小对象。它主要归结为自动释放的 NSString 和 NSNumber 对象。由于应用程序设计为在后台“24/7”运行,因此堆碎片成为一个大问题。

如果不对程序进行完全重组,有什么技术可以避免这种情况。

我在想: - 在最终发布后将对象返回到池中的对象池,但对象需要是可变的。 (NSMuttableString 会不会自己造成堆碎片?)

其他人如何处理这个问题?

编辑:这就是我对内存碎片产生怀疑的原因。查看 rpages 和 [vm-pageshortage]

    eIncident Identifier: 81E87769-8E16-4439-AFFA-6D077E01E5ED
CrashReporter Key: 96235931c31c6b92a16f5c1b1e4cb363a3d18a67
Hardware Model: iPhone4,1
OS Version: iPhone OS 7.0.4 (11B554a)
Kernel Version: Darwin Kernel Version 14.0.0: Fri Sep 27 23:00:48 PDT 2013; root:xnu-2423.3.12~1/RELEASE_ARM_S5L8940X
Date: 2013-12-13 22:43:36 -0800
Time since snapshot: 1582 ms

Free pages: 1105
Active pages: 3668
Inactive pages: 2035
Speculative pages: 46
Throttled pages: 100120
Purgeable pages: 0
Wired pages: 22159
File-backed pages: 5400
Anonymous pages: 349
Compressions: 0
Decompressions: 0
Compressor Size: 0
Uncompressed Pages in Compressor: 0
Largest process: Argus

Processes
Name <UUID> rpages recent_max fds [reason] (state)

Facebook <979b9707d85a31df94b986d91d8c3ce7> 2368 2368 100 [vm-pageshortage] (resume)
MobileSMS <339505ebbbc4301e87379b095a38ba13> 1448 1448 100 [vm-pageshortage] (background)
MobileMail <b3574f4bded1315cb2e50e5de205be48> 1575 1575 100 [vm-pageshortage] (resume) (continuous)
tccd <1fea8c5a71943151b5cd304c7eb0fd8c> 198 198 100 [vm-pageshortage] (daemon)
kbd <be2d64e41bf43e48a09a23fb129eb0b4> 739 739 100 [vm-pageshortage] (daemon)
librariand <15fb21b24e823e158caed9f9e9d8b87a> 299 299 100 [vm-pageshortage] (daemon)
MobilePhone <10e2242652423ae28f278a807a0d6384> 1852 1852 200 [vm-pageshortage] (continuous)
CVMServer <f26614f7fef63e2faa518272f0fc600a> 96 96 200 [vm-pageshortage] (daemon)
Argus <d214b453a3453121a8495d5c8eba80fd> 51299 51299 100 [vm-pageshortage] (location) (frontmost) (resume)
identityservices <18cc20db2e4739a782cc8e38e03eff52> 398 398 100 (daemon)
wifid <a5cf99e5a0f032a69bc2f65050b44291> 652 652 25 (daemon)
syslogd <6539f4cf4dcf34daadf1d99991926680> 140 140 50 (daemon)
powerd <0a253ac2a99236809422214be1700bc0> 126 126 100 (daemon)
vmd <93cffd22b64631afa08a42f6a85e1f33> 297 297 100 (daemon)
imagent <bef102e1faef39209926fb25f428a71e> 438 438 100 (daemon)

最佳答案

处理此问题的一种方法是找到导致碎片问题的“90%”罪魁祸首。您的代码中可能存在导致瑞士奶酪效应的病理状况。

初步行动

不言而喻 您应该首先说服自己您的高页面使用率是由于碎片造成的,不是 由于内存泄漏。 :-)

如果您还没有这样做,使用 Xcode 中的“Instruments”应用程序是观察您的程序在 iOS 模拟器中分配内存的绝佳方式。使用AllocationsLeaks 工具,您可以记录每个 对象分配和您的代码执行的malloc(),以及方便的时间戳。 (如果 ARC 没有像它应该的那样释放内存,Leaks 工具会免费向您显示对象映射中的循环。)

通常,工具会跟踪仍在使用的内存。您可以在Allocations 配置 Pane 中选择Created & Destroyed 选项以跟踪所有内容,这可以在摘要信息正上方的弹出窗口中查看。

还有一个 VM 页面分配工具可能会阐明您的问题。

可能的补救措施

一旦确定了罪魁祸首,您就可以重组代码以防止出现病态情况。或者,如果重组成本太高,您可以通过重用内存来减轻这种情况的影响。

通常,当分析显示对象分配和解除分配导致空洞或特定对象以惊人的频率分配/解除分配时,我会将违规的罪魁祸首放入对象“池”中。

这可以像将对象存储在 NSMutableArray 中并根据需要推送和弹出它们一样简单。

当然,您可能需要一些更复杂的东西,在获取对象时初始化对象,用准备好的对象填充池,并在池为空或不足时自动重新填充对象。在 iOS 中,如果收集的对象过多或收到内存不足警告,您还需要修剪池。

好处是,这可以是非常的通用代码,您可以永远重复使用。 :-)

旁注

您提到了不想让对象可变的问题。在某些情况下(如 NSString),如果您(提前)知道您需要对字符串执行的空间要求和操作,它可以帮助提高效率。这样你就可以提前告诉它你需要多少空间并“就地”操作字符串,从而减少分配开销。 (NSString 的幕后工作是另一篇文章。:-)

关于ios - 如何避免 iOS 中的堆碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com