获取应用占用内存
- 获取应用进程占用内存
- (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;
}
- 获取free内存(与xcode基本一致)
- (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;
}
- 获取APP可用内存
- (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;
}
- 获取应用cpu使用情况
- (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;
}