iOS 获取设备占用内存

获取应用占用内存

  1. 获取应用进程占用内存
c 复制代码
- (NSUInteger)memoryUsage {
    task_vm_info_data_t vmInfo;
    mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
    kern_return_t result = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);
    if (result != KERN_SUCCESS) {
        return 0;
    }
    // 单位为字节
    return (NSUInteger)vmInfo.phys_footprint; 
}
  1. 获取free内存(与xcode基本一致)
c 复制代码
- (double)usageComparisonFree {
    mach_port_t host_port = mach_host_self();
    mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
    
    vm_size_t page_size;
    vm_statistics64_data_t vminfo;
    host_page_size(host_port, &page_size);
    host_statistics64(host_port, HOST_VM_INFO64, (host_info64_t)&vminfo,&count);
    
    uint64_t free_size = (vminfo.free_count + vminfo.external_page_count + vminfo.purgeable_count - vminfo.speculative_count) * page_size;
    return free_size / 1024.0 / 1024.0;
}
  1. 获取APP可用内存
c 复制代码
- (NSInteger)memoryUsageLimitByByte {
    NSInteger memoryLimit = 0;
    // 获取当前内存使用数据
    if (@available(iOS 13.0, *)) {
        task_vm_info_data_t vmInfo;
        mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
        kern_return_t kr = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);
        if (kr == KERN_SUCCESS) {
            // 间接获取一下当前进程可用的最大内存上限
            // iOS13+可以这样计算:当前进程占用内存+还可以使用的内存=上限值
            NSInteger memoryCanBeUse = (NSInteger)(os_proc_available_memory());
            if (memoryCanBeUse > 0) {
                NSInteger memoryUsed = (NSInteger)(vmInfo.phys_footprint);
                memoryLimit = memoryUsed + memoryCanBeUse;
            }
        }
    }
    if (memoryLimit <= 0) {
        NSInteger deviceMemory = [NSProcessInfo processInfo].physicalMemory;
        memoryLimit = deviceMemory * 0.55;
    }
    if (memoryLimit <= 0) {
        // 这个值一般要小很多, 上面都获取不到才使用
        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 page_size;
        vm_statistics_data_t vm_stat;
        kern_return_t kr;
        kr = host_page_size(host_port, &page_size);
        if (kr == KERN_SUCCESS) {
            kr = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
            if (kr == KERN_SUCCESS)            {
                memoryLimit = vm_stat.free_count * page_size;
            }
        }
    }
    // 单位 Byte
    return memoryLimit;
}
  1. 获取应用cpu使用情况
c 复制代码
- (float)cpuUsage {
    kern_return_t kr;
    task_info_data_t tinfo;
    mach_msg_type_number_t task_info_count = TASK_INFO_MAX;
    
    kr = task_info(mach_task_self(), TASK_THREAD_TIMES_INFO, (task_info_t)tinfo, &task_info_count);
    if (kr != KERN_SUCCESS) return -1;
    
    task_thread_times_info_t times_info = (task_thread_times_info_t)tinfo;
    double userTime = times_info->user_time.seconds + times_info->user_time.microseconds / 1e6;
    double systemTime = times_info->system_time.seconds + times_info->system_time.microseconds / 1e6;
    double totalTime = userTime + systemTime;
    
    static double lastTotalTime = 0;
    static NSTimeInterval lastSamplingTime = 0;
    
    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
    NSTimeInterval elapsedTime = currentTime - lastSamplingTime;
    float cpuUsage = 0.0;
    
    if (lastSamplingTime != 0 && elapsedTime > 0) {
        cpuUsage = (totalTime - lastTotalTime) / elapsedTime * 100;
    }
    
    lastTotalTime = totalTime;
    lastSamplingTime = currentTime;
    
    return cpuUsage;
}
相关推荐
Zender Han3 小时前
Flutter 实现人脸检测 — 使用 google_mlkit_face_detection
android·flutter·ios
2501_916008894 小时前
iOS 26 性能分析深度指南 包含帧率、渲染、资源瓶颈与 KeyMob 协助策略
android·macos·ios·小程序·uni-app·cocoa·iphone
Mr_zheng9 小时前
iOS 26 UIKit和Swift上的更新
ios·swift
YungFan9 小时前
iOS26适配指南之UISearchController
ios·swift
陈彬技术实践10 小时前
从 Auto Layout 原理看:为什么 UITableView.tableHeaderView 无法自动撑开?
ios
2501_9159090618 小时前
tcpdump 抓包数据分析实战,命令、过滤、常见故障定位与真机补充流程
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
Digitally21 小时前
如何将iPhone上的HEIF图像下载到电脑
ios·iphone
书弋江山21 小时前
iOS一直讲的单元格优化
macos·ios·cocoa
00后程序员张1 天前
tcpdump 抓包分析,命令、过滤技巧、常见症状定位与移动真机补充方案
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
2501_929382651 天前
iphone IOS3~IOS9游戏 旧iphone 单机游戏合集分享
游戏·ios·iphone