Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 8009ddd215826ac2774c958bafc223966124bfd1
https://github.com/WebKit/WebKit/commit/8009ddd215826ac2774c958bafc223966124bfd1
Author: Ben Nham <[email protected]>
Date: 2026-09-15 (Tue, 15 Sep 2026)
Changed paths:
M Source/WTF/wtf/MemoryFootprint.h
M Source/WTF/wtf/PlatformEnable.h
M Source/WTF/wtf/PlatformEnableCocoa.h
M Source/WTF/wtf/cocoa/MemoryFootprintCocoa.cpp
M Source/WebKit/Platform/Logging.h
M Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in
M Source/WebKit/SourcesCocoa.txt
M Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp
M Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h
M Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp
M Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h
M Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h
M Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm
M Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm
M Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm
A Source/WebKit/UIProcess/MemoryFootprintMonitor.cpp
A Source/WebKit/UIProcess/MemoryFootprintMonitor.h
M Source/WebKit/UIProcess/WebProcessProxy.h
M Source/WebKit/UIProcess/WebProcessProxy.messages.in
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm
M Source/cmake/OptionsCocoa.cmake
M Source/cmake/WebKitFeatures.cmake
M Tools/TestWebKitAPI/SourcesCocoa.txt
A Tools/TestWebKitAPI/Tests/WebKit/WKWebView/MemoryFootprintMonitor.mm
M Tools/WebKitTestRunner/TestController.cpp
Log Message:
-----------
[Site Isolation] Move periodic memory monitor to UIProcess
https://bugs.webkit.org/show_bug.cgi?id=323690
rdar://186948820
Reviewed by Per Arne Vollan.
On Mac, each WebProcess samples its own memory footprint every 30 seconds to
check if it's exceeded
a per-page foreground or background memory limit (see
setShouldUsePeriodicMemoryMonitor in
MemoryPressureHandler). This doesn't make sense when Site Isolation is enabled
since a page can be
rendered by multiple processes.
This patch moves the memory measurement to a new UIProcess class called
MemoryFootprintMonitor. This
samples the footprint of all non-suspended WebContent processes every 30
seconds. It applies both
per-page and per-process memory limits (per-process limits apply only to
processes without pages,
like standalone worker processes). The actual limits are picked to match the
limits we enforce with
Site Isolation disabled.
Footprint monitoring was always enabled on macOS, but this patch enables it on
iOS as
well. Previously on iOS, we counted on kernel enforced per-process jetsam
limits to do monitoring
for us, but per-process monitoring isn't enough when Site Isolation is enabled.
This monitor layers
on top of kernel jetsam on iOS to help enforce per-page jetsam limits when SI
is enabled.
One complication with footprint monitoring on iOS is that task_name_for_pid on
any pid other than
your own pid is not allowed by the iOS app sandbox. In order for the iOS
UIProcess to be able to
measure the footprint of WebProcess, we have WebProcess pass its task name port
to the
UIProcess. This is a low capability port that basically only allows us to call
task_info on that
port with certain basic flavors of task_info.
The footprint measurements themselves are done on a background queue since we
don't want to make
potentially hundreds of task_info syscalls at around the same time on the
UIProcess main thread.
We also disable monitoring when ASAN, system malloc, or various JSC options are
enabled in
WebProcess, which matches the previous behavior of MemoryPressureHandler.
Test: Tools/TestWebKitAPI/Tests/WebKit/WKWebView/MemoryFootprintMonitor.mm
* Source/WTF/wtf/MemoryFootprint.h:
* Source/WTF/wtf/PlatformEnable.h:
* Source/WTF/wtf/PlatformEnableCocoa.h:
* Source/WTF/wtf/cocoa/MemoryFootprintCocoa.cpp:
(WTF::memoryFootprint):
* Source/WebKit/Platform/Logging.h:
* Source/WebKit/Scripts/webkit/opaque_ipc_types.tracking.in:
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp:
(API::ProcessPoolConfiguration::copy):
* Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h:
* Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp:
(WKContextConfigurationSetMemoryLimitForTesting):
* Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
* Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
(-[_WKProcessPoolConfiguration setMemoryLimitForTesting:]):
(-[_WKProcessPoolConfiguration memoryLimitForTesting]):
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitialize):
* Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm:
(WebKit::WebProcessProxy::setTaskNamePort):
* Source/WebKit/UIProcess/MemoryFootprintMonitor.cpp: Added.
(WebKit::MemoryFootprintMonitor::defaultConfiguration):
(WebKit::MemoryFootprintMonitor::singleton):
(WebKit::MemoryFootprintMonitor::measurementQueueSingleton):
(WebKit::MemoryFootprintMonitor::MemoryFootprintMonitor):
(WebKit::shouldEnforceMemoryLimits):
(WebKit::MemoryFootprintMonitor::start):
(WebKit::MemoryFootprintMonitor::setConfiguration):
(WebKit::processThrottleState):
(WebKit::MemoryFootprintMonitor::measurementTimerFired):
(WebKit::MemoryFootprintMonitor::didCompleteMeasurement):
* Source/WebKit/UIProcess/MemoryFootprintMonitor.h: Added.
(WebKit::MemoryFootprintMonitor::configuration const):
* Source/WebKit/UIProcess/WebProcessProxy.h:
* Source/WebKit/UIProcess/WebProcessProxy.messages.in:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::accessibilityFocusedUIElement):
* Source/cmake/OptionsCocoa.cmake:
* Source/cmake/WebKitFeatures.cmake:
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/MemoryFootprintMonitor.mm: Added.
(TestWebKitAPI::touchMegabytes):
(TestWebKitAPI::PageMemoryLimit)):
* Tools/WebKitTestRunner/TestController.cpp:
(WTR::TestController::generateContextConfiguration const):
Canonical link: https://commits.webkit.org/321179@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications