- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我运行以下代码时,它会慢慢耗尽我的内存,甚至开始使用交换:
long long length = 1024ull * 1024ull * 1024ull * 2ull; // 2 GB
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
}
如果我在没有 for 循环的情况下运行它,则根本不会使用内存:
long long length = 1024ull * 1024ull * 1024ull * 2ull;
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
/* for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
} */
我只能得出结论,NSMutableData 只是在“保留”内存,当它被访问时,它真的会“分配”它。具体是怎么做到的?
这是通过硬件 (CPU) 完成的吗?
NSMutableData 是否有办法在其“保留”内存中捕获内存写入,然后才进行“分配”?
这是否也意味着对 [NSMutableData dataWithLength:length]
的调用永远不会失败?如果需要,它可以使用交换分配任意大小的内存来获取它吗?
如果失败,我的 db 变量是否为空?
在 apple 的“NSMutableData Class Reference”中,我只看到关于这些主题的模糊句子。
最佳答案
这与其说是一个 NSMutableData 问题,不如说是一个内核/操作系统问题。如果进程请求一个(大)内存块,内核通常只会说“没关系,给你”。但只有在实际使用它时,它才会真正(“物理地”)分配。这没关系,因为如果您的程序以 2 GB 的 malloc 开始(就像您在这里所做的那样),否则它会立即推出其他程序进行交换,而实际上您通常不会立即使用 2 GB。
当访问一个实际不存在于物理内存中的内存页时,内核会从CPU那里得到一个信号。如果页面应该在那里(因为它在您的 2 GB block 内),它将被放置到位(可能来自交换),您甚至不会注意到。如果该页面不应该存在(因为地址未在您的虚拟内存中分配),您将遇到段错误(SIGSEGV 或 EXC_BAD_ACCESS 类错误)。
其中一个相关主题是“overcommit(ment)”,其中内核 promise 比实际可用的内存更多。如果所有进程都开始使用它们 promise 的内存,它可能会导致严重的问题。这取决于操作系统。
互联网上有很多页面对此进行了更好、更详细的解释;我只是想做一个简短的介绍,这样你就可以在谷歌中输入条款了。
编辑 刚刚测试过,linux 很容易向我 promise 4 TB 的内存,而 - 我向你保证 - 该机器中的总磁盘 存储空间甚至不到 1 TB .您可以想象,如果不注意这一点,可能会在构建关键任务系统时引起一些麻烦。
关于objective-c - NSMutableData 是如何分配内存的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387090/
我正在将一个大文件读入 NSMutableData 对象。 var lBuffer : NSMutableData = try NSMutableData(contentsOfFile: pFileP
我正在我的应用程序中进行 JSON 解析,当我使用 responseData = [NSMutableData data]; 它在 [responseData setLength:0] 上崩溃; -
我在函数中使用下面提到的行 NSMutableData *data = [[NSMutableData alloc] init]; 我很快就调用了这个函数(例如 100 次)。所以我的问题是,最初它
我有一个用于连接 httprequests 的类。我收到“NSMutableData”的内存泄漏,尽管我在连接对象的“didFailWithError”和“connectionDidFinishLoa
我使用下面所示的代码下载了该文件。然后我尝试将 NSMutableData 变量保存到文件中,但是,该文件未创建。我究竟做错了什么?我需要将 NSMutableData 转换为 NSString 吗?
我在使用 NSMutableData 时遇到一个问题。 我定义了一个 NSMutableData *receivedData,并尝试将多个 NSData* 数据复制到 receivedData。我刚刚
我的应用程序从服务器获取一些json数据,并使用NSMUtableData对象存储这些数据。 但是调试器报告以下错误: [NSCFString setLength:]: unrecognized se
我正在尝试从响应中获取数据。 我正在使用NSURLConnectionDelegate,NSURLConnectionDataDelegate。 该项目使用ARC。 @interface MainMe
我正在尝试将图像上传到工作正常的 yFrog,但我只想从响应中获取 URL。当我使用 NSURLConnection 方法时 - (void) connectionDidFinishLoading:(
您好,我正在尝试创建一个我想通过网络发送到服务器的数据包,我几乎已经对数据包进行了排序,但是它缺少一个长度标识符,我需要在我的方法结束时计算它并添加放入数据包。 数据包结构是这样的 前导值标识符 (U
让我开始说吧,我是 iOS/Xcode 编程的新手,所以我什至不知道该问什么。我正在尝试向应用程序添加一个静态库,但我以崩溃告终。库包有一个.h 文件和一个.a 文件。我正在询问有关如何继续解决问题的
我将如何附加这个二进制字符串 111000111000111111000111000111 到包含 png 的 NSMutableData 对象(NSMutableData *dataForPNGFi
这个问题已经有答案了: 已关闭10 年前。
在我的程序中,我有一个 NSMutableData 变量,用于收集来自 http://www.nhara.org/scored_races-2013.htm 的信息。 .大约第三次从网站获取信息后,当
我正在尝试快速将一个字节附加到 NSMutable 数据变量,我正在寻找一种更简单的方法。相关的 Objective-C 代码是: NSMutableData *data = [[NSMutableD
NSMutableData *requestData = (NSMutableData*)[request responseData]; 返回 “[{JSON_STRING}]” 所以我想去掉“[”/
我有一个被多次调用的函数,它创建数据通过 tcp 发送到服务器。我想我在某个地方丢失了数据。 我想知道什么是正确的方法: 在程序开始时使用finalData=[[NSMutableData alloc
我正在尝试通过资源库上传一个大小为 100MB 的视频。但是当我尝试使用 -(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)o
我使用 NSMutableData 对象来存储表示系列数据的 32 字节结构列表。这些系列可能会被扩展、添加、对齐等。为了节省不必要的对象分配,我尝试将字节扩展并附加到现有对象,而不是分配新对象。 我
我希望能够确定 NSMutableData 实例中的字节数是否等于零。我该怎么做? 最佳答案 简单: if([data length] == 0) { //do something } 其中 da
我是一名优秀的程序员,十分优秀!