program tip

iOS 기기에서 사용 가능한 RAM 양 확인

radiobox 2020. 11. 14. 10:06
반응형

iOS 기기에서 사용 가능한 RAM 양 확인


배터리 잔량, 메모리 등과 같은 시스템 정보를 표시하는 "시스템 정보"앱을 많이 보셨을 것입니다.

비슷한 방식으로, 메모리 경고를 피하기 위해 특정 뷰를 덤프하거나 유지하는 것이 가장 좋은시기를 더 잘 결정할 수 있도록 내 앱에서 현재 사용 가능한 RAM 양을 검색하는 방법이 있습니까?


#import <mach/mach.h>
#import <mach/mach_host.h>

void print_free_memory ()
{
    mach_port_t host_port;
    mach_msg_type_number_t host_size;
    vm_size_t pagesize;

    host_port = mach_host_self();
    host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    host_page_size(host_port, &pagesize);        

    vm_statistics_data_t vm_stat;

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
        NSLog(@"Failed to fetch vm statistics");
    }

    /* Stats in bytes */ 
    natural_t mem_used = (vm_stat.active_count +
                          vm_stat.inactive_count +
                          vm_stat.wire_count) * pagesize;
    natural_t mem_free = vm_stat.free_count * pagesize;
    natural_t mem_total = mem_used + mem_free;
    NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}

이 호출은 GPU에서 사용중인 메모리를 고려하지 않습니다. 예상 시스템 램보다 작은 크기가 표시되는 경우. 할당 된 그래픽 메모리보다 많습니다.


이것은 Swift 4에서 작동합니다.

여기서 정말 중요한 차이점은 곱하기 전에 Int64로 캐스트한다는 것입니다. 그렇지 않으면 특히 PC 메모리를 사용하는 시뮬레이터에서 실행하는 경우 빠르게 오버플로가 발생하기 때문입니다.

var pagesize: vm_size_t = 0

let host_port: mach_port_t = mach_host_self()
var host_size: mach_msg_type_number_t = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
host_page_size(host_port, &pagesize)

var vm_stat: vm_statistics = vm_statistics_data_t()
withUnsafeMutablePointer(to: &vm_stat) { (vmStatPointer) -> Void in
    vmStatPointer.withMemoryRebound(to: integer_t.self, capacity: Int(host_size)) {
        if (host_statistics(host_port, HOST_VM_INFO, $0, &host_size) != KERN_SUCCESS) {
            NSLog("Error: Failed to fetch vm statistics")
        }
    }
}

/* Stats in bytes */
let mem_used: Int64 = Int64(vm_stat.active_count +
        vm_stat.inactive_count +
        vm_stat.wire_count) * Int64(pagesize)
let mem_free: Int64 = Int64(vm_stat.free_count) * Int64(pagesize)

You can check the available RAM Memory in an iOS devices

    #import mach\mach.h
    #import mach\mach_host.h

     static natural_t get_free_memory(void)  
     {  
       mach_port_t host_port;  
       mach_msg_type_number_t host_size;  
       vm_size_t pagesize;  
       host_port = mach_host_self();  
       host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);  
       host_page_size(host_port, &pagesize);  
       vm_statistics_data_t vm_stat;  
       if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)  
       {  
         NSLog(@"Failed to fetch vm statistics");  
         return 0;  
       }  
       /* Stats in bytes */  
       natural_t mem_free = vm_stat.free_count * pagesize;  
       return mem_free;  
     }  

참고URL : https://stackoverflow.com/questions/5012886/determining-the-available-amount-of-ram-on-an-ios-device

반응형