Had claude opus 4.7 do some dianostics on the memory leak I've been having. Here's what claude found.
WebKit.GPU process leaking IOSurface memory — 10GB RSS, 5245 surfaces after 2.5 days
Summary
The com.apple.WebKit.GPU.Orion process accumulates IOSurface allocations over time without releasing them. After 2.5 days of uptime, the GPU process was holding 5245 IOSurface regions totaling 17.9GB virtual / 3.7GB resident / 2.7GB swapped. Physical footprint reached 15.3GB peak, 10.1GB at sample time.
This looks like a surface leak rather than fragmentation — the region count is the giveaway.
Environment
- Orion version: RC, WebKit 625 (625.1.8)
- macOS: 26.4.1 (25E253)
- Architecture: ARM64 (Apple Silicon)
- Process uptime at sample: 2 days 12 hours (launched 2026-04-14 07:29:56, sampled 2026-04-16 19:46:41)
Header from vmmap
Process: com.apple.WebKit.GPU.Orion [16007]
Path: /Applications/Orion RC.app/Contents/Frameworks/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.GPU.xpc/Contents/MacOS/com.apple.WebKit.GPU.Orion
Identifier: com.apple.WebKit.GPU
Version: 625 (625.1.8)
Code Type: ARM64
Platform: macOS
Parent Process: launchd [1]
Target Type: live task
Date/Time: 2026-04-16 19:46:41.003 -0700
Launch Time: 2026-04-14 07:29:56.299 -0700
OS Version: macOS 26.4.1 (25E253)
Physical footprint: 10.1G
Physical footprint (peak): 15.3G
Idle exit: dirty
Region-type summary (the evidence)
==== Summary for process 16007
ReadOnly portion of Libraries: Total=1.5G resident=364.7M(24%) swapped_out_or_unallocated=1.1G(76%)
Writable regions: Total=31.2G written=6.4G(21%) resident=4.1G(13%) swapped_out=8.7G(28%) unallocated=18.4G(59%)
VIRTUAL RESIDENT DIRTY SWAPPED VOLATILE NONVOL EMPTY REGION
REGION TYPE SIZE SIZE SIZE SIZE SIZE SIZE SIZE COUNT (non-coalesced)
=========== ======= ======== ===== ======= ======== ====== ===== =======
Accelerate framework 256K 256K 48K 208K 0K 256K 0K 2
Activity Tracing 256K 48K 48K 0K 0K 48K 0K 1
ColorSync 80K 16K 16K 64K 0K 0K 0K 5
CoreAnimation 8208K 592K 576K 7536K 0K 96K 0K 157
CoreMedia HTTP cache 368K 0K 0K 368K 0K 0K 0K 19
CoreMedia memory pool 32K 32K 32K 0K 0K 0K 0K 1
CoreServices 16K 0K 0K 16K 0K 0K 0K 1
IOAccelerator 832K 832K 832K 0K 0K 0K 0K 18
IOAccelerator (graphics) 65.4M 23.2M 13.6M 9904K 0K 23.2M 30.0M 902
IOKit 112K 96K 96K 0K 0K 16K 0K 7
IOSurface 17.9G 3.7G 960.3M 2.7G 0K 3.7G 12.7G 5245
JS VM Gigacage (reserved) 4.0G 0K 0K 0K 0K 0K 0K 1 reserved VM address space (unallocated)
Kernel Alloc Once 32K 16K 16K 0K 0K 0K 0K 1
MALLOC 16.6M 848K 848K 7072K 0K 0K 0K 20
MALLOC (empty) 144K 16K 16K 128K 0K 0K 0K 3
MALLOC guard page 3680K 0K 0K 0K 0K 0K 0K 4
MALLOC metadata 3696K 2544K 2496K 1088K 0K 0K 0K 12
MALLOC_LARGE (empty) 218.8M 0K 0K 218.8M 0K 0K 0K 7 see MALLOC ZONE table below
MALLOC_NANO metadata 288K 272K 272K 0K 0K 0K 0K 9 see MALLOC ZONE table below
MALLOC_SMALL 516.1M 160.8M 160.8M 232.5M 0K 0K 400K 674 see MALLOC ZONE table below
MALLOC_SMALL (empty) 79.9M 5296K 5296K 13.7M 0K 0K 0K 284 see MALLOC ZONE table below
MALLOC_TINY 4096K 224K 224K 96K 0K 0K 0K 1 see MALLOC ZONE table below
Memory Tag 22 64.0M 112K 112K 16K 0K 0K 0K 1
Memory Tag 241 320K 0K 0K 80K 0K 0K 0K 2
STACK GUARD 58.2M 0K 0K 0K 0K 0K 0K 139
Stack 81.3M 3232K 2848K 1760K 0K 0K 0K 139
Stack (reserved) 544K 0K 0K 0K 0K 0K 0K 1 reserved VM address space (unallocated)
Stack Guard 16K 0K 0K 0K 0K 0K 0K 1
VM_ALLOCATE 1.0G 20.1M 18.7M 1456K 0K 20.0M 0K 6619
VM_ALLOCATE (media) 10.0M 128K 128K 0K 0K 0K 0K 1
WebKit Malloc 918.5M 89.1M 47.1M 39.6M 0K 0K 0K 36
__AUTH 3550K 2815K 95K 112K 0K 0K 0K 341
__AUTH_CONST 56.0M 33.0M 32K 80K 0K 0K 0K 645
__CTF 824 824 0K 0K 0K 0K 0K 1
__DATA 23.3M 5891K 947K 573K 0K 0K 0K 613
__DATA_CONST 32.1M 14.9M 144K 635K 0K 0K 0K 661
__DATA_DIRTY 4107K 3211K 705K 447K 0K 0K 0K 555
__FONT_DATA 2352 752 0K 0K 0K 0K 0K 1
__LINKEDIT 633.5M 20.8M 0K 0K 0K 0K 0K 15
__OBJC_RO 79.1M 48.2M 0K 0K 0K 0K 0K 1
__OBJC_RW 2597K 2149K 53K 16K 0K 0K 0K 1
__TEXT 859.5M 343.9M 0K 0K 0K 0K 0K 679
__TPRO_CONST 128K 16K 16K 112K 0K 0K 0K 2
dyld private memory 128K 32K 32K 32K 0K 0K 0K 1
mapped file 440.9M 4048K 0K 0K 0K 0K 0K 67
owned unmapped 6.0G 23.9M 23.9M 5.4G 0K 0K 0K 2143
owned unmapped (graphics) 207.4M 157.9M 29.9M 39.6M 0K 0K 0K 119
page table in kernel 11.7M 11.7M 11.7M 0K 0K 0K 0K 1
shared memory 186.0M 240K 240K 0K 0K 0K 0K 167
unused but dirty shlib __DATA 3240K 2158K 216K 458K 0K 0K 0K 307
=========== ======= ======== ===== ======= ======== ====== ===== =======
TOTAL 33.4G 4.6G 1.3G 8.7G 0K 3.7G 12.8G 20633
TOTAL, minus reserved VM space 29.4G 4.6G 1.3G 8.7G 0K 3.7G 12.8G 20633
Reproduction
I do not yet have a minimal reproducer — the leak accumulated during normal multi-day browsing. Happy to run any additional diagnostics if an engineer wants to suggest them.
Note: I attempted leaks(1) but the process is signed with hardened runtime and no get-task-allow, so even sudo leaks cannot attach. A debug build or enabling debug entitlements on a TestFlight/RC build would allow deeper allocation-stack capture.
How the data was collected
sudo vmmap <pid of com.apple.WebKit.GPU.Orion>
Full vmmap output (20,747 lines, 3MB) available on request.