我使用中央调度框架通过
DISPATCH_SOURCE_TYPE_MEMORYPRESSURE
处理内存压力变化。这是我在 Objective C 中的程序:
#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Starting memory pressure monitoring...");
// Create a dispatch source for memory pressure events
dispatch_source_t memoryPressureSource = dispatch_source_create(
DISPATCH_SOURCE_TYPE_MEMORYPRESSURE,
0,
DISPATCH_MEMORYPRESSURE_WARN |
DISPATCH_MEMORYPRESSURE_CRITICAL |
DISPATCH_MEMORYPRESSURE_NORMAL,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
);
if (memoryPressureSource == NULL) {
NSLog(@"Failed to create dispatch source");
return 1;
}
// Set the event handler block to be executed on memory pressure events
dispatch_source_set_event_handler(memoryPressureSource, ^{
NSLog(@"Memory pressure event handled");
});
dispatch_source_set_registration_handler(memoryPressureSource, ^{
NSLog(@"Memory pressure event registered");
});
dispatch_activate(memoryPressureSource);
// Keep the main thread alive to let the dispatch source process events
dispatch_main();
}
return 0;
}
我通过命令编译它:
clang -framework Foundation -framework CoreFoundation -o memory_pressure_tracker ./untitled.mm
并启动它:
./memory_pressure_tracker
同时在另一个终端中我模拟高内存压力:
sudo memory_pressure -l critical
.
尽管活动监视器中的内存压力发生变化,但我的程序不会写入任何有关它的日志。它写入的唯一日志如下:
2024-09-10 10:41:27.048 memory_pressure_tracker[130:11424978] Starting memory pressure monitoring...
2024-09-10 10:41:27.048 memory_pressure_tracker[130:11424985] Memory pressure event registered
问题出在哪里?
我在 M1 Max 上的 MacOS Sonoma 14.6.1 上进行了测试。
看起来 MacOS 足够聪明,不会报告内存压力的小峰值。 当我通过命令
sudo memory_pressure -l critical
模拟临界内存压力时,该命令不断分配内存直到压力变得临界,我没有调用处理程序,因为压力立即恢复到正常状态。
同样的情况也发生在
sudo memory_pressure -S -l critical -s 1
上,它不分配内存,但让 MacOS 模拟临界压力 1 秒。
当我模拟压力 10 秒时,我设法呼叫了处理程序:
sudo memory_pressure -S -l critical -s 10
提供的源代码中没有错误,但 MacOS 不会报告每个关键内存压力峰值。