内存压力检测在 MacOS 上不起作用

问题描述 投票:0回答:1

我使用中央调度框架通过

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 上进行了测试。

objective-c macos grand-central-dispatch
1个回答
0
投票

看起来 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 不会报告每个关键内存压力峰值。

© www.soinside.com 2019 - 2024. All rights reserved.