prl_vm_app memory leak under specific loads

aelleth

Bit poster
Summary
When running Diablo II: Resurrected inside a Parallels VM, the Parallels host process prl_vm_app exhibits sustained heap growth consistent with a runaway allocation loop. The host process grows to ~200-300 GB virtual size with almost all pages swapped out, pushing macOS into high memory pressure, shortly followed by a crash/termination of the entire VM process.

Guest memory usage in Windows Task Manager remains stable (~3 GB idle, ~8 GB under load), suggesting this is not a guest OS/guest application memory leak but a host-side allocation leak in prl_vm_app.

Environment
Parallels build version: 26.2.57373.0
Host OS version: macOS Tahoe 26.0.1 and 26.3
Guest OS version: Windows 11 24H2 and 25H2
Guest application that triggers this leak: Diablo II: Resurrected
Host spec: MacBook Pro M4 Max (16-core, 64GB of memory)
Guest spec: 8 cores, 32GB of memory

Reproduction
  1. Start the Windows 11 VM in Parallels. Memory profile stays flat.
  2. Launch Diablo II: Resurrected inside the VM.
  3. Observe malloc calls steadily increasing at a rate of ~1.1 million/second and process vsize growing at approximately 3.1 GB/minute, suggesting an average allocation size of 48 bytes.
  4. Initially, resident size grows in lockstep with vsize and gets swapped after a while. In practice, this will show up as memory compression in the host, not as a swap-out to disk.
  5. Keep the application open for 1h 15m-1h 20m (either in the main menu or inside a game).
  6. Eventually both game video and audio start stuttering; macOS Activity Monitor shows high memory pressure and what appears to be very high swap activity.
  7. Finally, the entire prl_vm_app process is killed.
Sample vmmap output for prl_vm_app (truncated)
PHP:
                                             VIRTUAL   RESIDENT      DIRTY    SWAPPED ALLOCATION      BYTES DIRTY+SWAP          REGION
MALLOC ZONE                                     SIZE       SIZE       SIZE       SIZE      COUNT  ALLOCATED  FRAG SIZE  % FRAG   COUNT
===========                                  =======  =========  =========  =========  =========  =========  =========  ======  ======
DefaultMallocZone_0x1063c0000                 206.4G      85.5M      85.4M     206.1G 4244052755     205.3G     879.8M      1%   54261

Why this is likely a prl_vm_app allocation bug (not a guest OS/application bug)
- The growth is attributed to a host MALLOC ZONE (DefaultMallocZone...), i.e. malloc(3) calls in prl_vm_app itself. This is not the typical accounting shape of "guest RAM backing" (which is usually page-granular and not dominated by billions of tiny malloc allocations).
- The leaked objects are very small (~48 bytes average) and extremely numerous (billions of allocations). That profile is characteristic of host-side object churn.
- Symptom progression aligns with host memory pressure mechanics: as prl_vm_app grows, macOS enters high memory pressure. The guest then exhibits A/V freezes consistent with host-side page-in/page-out latency and resource starvation, followed by VM instability/crash.

Related reports
This appears consistent with previous issues like https://forum.parallels.com/threads/extremely-high-number-on-ram-usage-for-guest-macos-vm.365513 and https://forum.parallels.com/threads/macos-guest-vm-ram-usage.365538

Final thoughts
It should suffice to run D2R for just a few minutes to observe the leak; pinpointing the exact call should be fairly straightforward with debug symbols available.

Happy to provide any extra logs/screenshots if needed, but vmmap is really high signal.
 
Back
Top