Thanks for your detailed analysis.
First, to clarify our testing setup: we write and touch allocated memory after malloc, so the failures we encounter in production are not caused by pure untouched allocations exhausting virtual address space.
We fully understand the distinction between virtual address space limits and physical memory constraints. On 3GB iOS devices, our app hits compound restrictions: linking JavaScriptCore expands the overall process virtual address space quota, yet JSC itself consumes nearly 1GB of that address space footprint.
This large baseline reservation of JSC only becomes observable under Instruments memory profiling starting from iPadOS 26.4. Earlier OS releases did not expose this consumption in profiling tools.
We also observed that this reserved size varies based on device physical RAM: it occupies roughly 1GB on 3GB devices, and expands to approximately 2GB on devices with larger memory capacity. We are continuing to complete verification on more hardware models.
Without JSC linked, the app crashes at approximately 1.52GB memory consumption, which creates critical obstacles for core business workflows.
Our project extensively performs 4MB and 8MB memory allocations. These allocation sizes fall into libmalloc’s high-fragmentation bucket, further lowering the effective crash threshold and worsening runtime stability.
Unfortunately, we cannot remove JSC. Our core capabilities including JS bidirectional communication, resource rendering and dynamic business logic all depend on the JSC runtime. Even with JSC linked to unlock a higher virtual address limit, memory pressure remains severe on 3GB RAM hardware. A large group of users with these older devices continuously experience crashes, freezes, background Jetsam termination and loading failures.
We have completed all feasible application-layer optimizations: adjusting allocation granularity, optimizing memory release paths and reducing resident memory. We have also evaluated building a custom allocator via bulk large allocations or low-level vm_allocate/mmap calls as you suggested. However, we recognize such improvements cannot fundamentally break through the hard system limits we have observed.
Therefore we sincerely hope to obtain further official guidance:
Tuning options for JavaScriptCore to cut its baseline virtual address reservation and runtime memory overhead;
Recommended practices to mitigate libmalloc fragmentation for frequent 4MB/8MB allocations;
Any available system-level memory scheduling advice for memory-heavy applications running on 3GB iOS devices.