, 그것은 천천히 내 기억을 먹고도 스왑을 사용하여 시작합니다NSMutableData는 어떻게 메모리를 할당합니까? 나는 다음과 같은 코드를 실행하면
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;
}
내가주기에 대한 기억이 전혀 사용되지 않는없이 실행하는 경우 :
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가 "예약 된"메모리에서 메모리 쓰기를 catch 한 다음 "할당"을 수행하는 방법이 있습니까?
[NSMutableData dataWithLength:length]
에 대한 호출이 결코 실패 할 수 없다는 의미입니까? 필요한 경우 스왑을 사용하여 메모리 크기를 할당 할 수 있습니까?
실패 할 경우 db 변수는 null이됩니까?
사과의 "NSMutableData 클래스 참조"에서 나는이 주제에 관해 막연한 문장을 보았습니다.
'overcommit_memory'와'overcommit_ratio'를 설정하여 리눅스 오버 커밋 동작을 변경할 수 있습니다. 특히'overcommit_memory'를 2로 설정하면 스왑 공간 + 실제 메모리의 overcommit_ratio % 만 커밋합니다. –
[overcommit-accounting documentation] (http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting)도 참조하십시오. –
리눅스에 대한 흥미로운 점은 malloc이 표면 아래에있는'mmap()'이 과도한 커밋 동작을 허용하는 플래그'MAP_NORESERVE'를 취한다는 것입니다. 그러나 malloc()과 같이 -이 플래그를 지정하지 않으면 여전히 오버 커밋됩니다. – mvds