반응형

메모리 정보 가져오기

프로젝트를 하다보면 메모리 정보를 코드상에서 확인해야 할때가 있다. 

XCode에서 Debug Navigator에서 보는 것과는 사뭇 다르다.

아래 코드들은 VM에서 정보를 가져오기 때문에 실제 앱이 사용할수 있는 것이며

디바이스 전체 메모리와는 다를수 밖에 없다고 생각한다.


디바이스 전체 물리적인 메모리 가져오기

ProcessInfo.processInfo.physicalMemory


현재 앱이 사용중인 메모리 (Used Memory)

Swift 3.0.1 기준

func getUsedMemory() -> UInt {
    var info = mach_task_basic_info()
    var count = mach_msg_type_number_t(MemoryLayout.size(ofValue: info) / MemoryLayout<integer_t>.size)
    let kerr = withUnsafeMutablePointer(to: &info) { infoPtr in
        return infoPtr.withMemoryRebound(to: integer_t.self, capacity: Int(count)) { (machPtr: UnsafeMutablePointer<integer_t>) in
            return task_info(
                mach_task_self_,
                task_flavor_t(MACH_TASK_BASIC_INFO),
                machPtr,
                &count
            )
        }
    }
    guard kerr == KERN_SUCCESS else {
        return 0
    }
    return UInt(info.resident_size)
}

Objective-C 기준

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

vm_size_t usedMemory(void) {
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size);
    return (kerr == KERN_SUCCESS) ? info.resident_size : 0; // size in bytes
}


사용 가능한 메모리(Free Memory)

Swift 3.0.1 기준

/**
 가상 메모리 페이지 크기 가져오기 
 
 - returns: 가상 메모리 페이지 크기
 */
fileprivate func getVMPageSize() -> UInt {
    var pageSize: vm_size_t = 0
    let result = withUnsafeMutablePointer(to: &pageSize) { (size) -> kern_return_t in
        host_page_size(mach_host_self(), size)
    }

    guard result == KERN_SUCCESS else {
        return 0
    }
    
    return UInt(pageSize)
}

/**
 가상 메모리 데이터 가져오기
 
 - returns: 가상 메모리 데이터 구조체
 */
fileprivate func getVMStatistics() -> vm_statistics {
    var vmstat = vm_statistics()
    var count = UInt32(MemoryLayout<vm_statistics>.size / MemoryLayout<integer_t>.size)
    
    let result = withUnsafeMutablePointer(to: &vmstat) {
        $0.withMemoryRebound(to: integer_t.self, capacity: 1) {
            return host_statistics(mach_host_self(), HOST_VM_INFO, host_info_t($0), &count)
        }
    }
    
    guard result == KERN_SUCCESS else {
        return vm_statistics()
    }
    
    return vmstat
}

/**
 사용 가능한 메모리 가져오기
 
 - returns: 사용가능한 메모리
 */
func getFreeMemory() -> UInt {
    return UInt(getVMStatistics().free_count) * getVMPageSize()
}

Objective-C 기준

#import <mach/mach.h>

vm_size_t freeMemory(void) {
    mach_port_t host_port = mach_host_self();
    mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    vm_size_t pagesize;
    vm_statistics_data_t vm_stat;
    
    host_page_size(host_port, &pagesize);
    (void) host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
    return vm_stat.free_count * pagesize;
}


반응형

'iOS > Tip' 카테고리의 다른 글

IndicatorView  (0) 2016.12.22
JavaScript to Native  (0) 2016.12.21
Autolayout 우선순위  (0) 2016.12.14
URLSession 사용시 참고  (0) 2016.12.08
현재 IP 가져오기  (0) 2016.11.29
Cookies 저장과 값 읽기  (0) 2016.11.28
UIView, UIWebView 캡쳐하기  (0) 2016.11.04
TextView, TextField에 메뉴 추가 하기  (0) 2016.10.14
Posted by 까칠코더
,