Is the mem output accurate ?
Not an expert but I assume that it accurately reports what the kernel reports. Which leads to the question of whether the kernel's report is accurate. Judging by the wildly different results, it doesn't seem to be, likely as when it was designed having 4GB's of ram installed was a fantasy and before Warp V4.5 (Warp V4+fp 13) the non-server OS/2 could only access 1GB of address space, half of which was given to the kernel. That is low memory.
We're dealing with different types of memory.
Accessible to the system is how much actual ram is accessible, 4GB minus PCI space and such including video memory. I couldn't even install ArcaOS to this box until I reduced the video ram (onboard graphics). Now it is about 3.4 GB's, I'm not in OS/2 right now so going by memory. My usual box, it is 3.2 GB.
Virtual memory is how much the CPU can access, you can have multiple processes using the same address range like with multiple DOS sessions. IIRC, the virtual limit, in theory, is 2TB. As it allocated in 4KB chunks, there's selectors and such to keep track of it and they'll run out. The Kernel also has to keep track and uses 32 bit variables, sometimes signed, so 2-4GB limit before perhaps wrapping or overflowing and crashing. Virtual memory can live in the swap file as well as ram. Our swap file is limited to 2GB, I've had the system die due to a swap file full condition when it grew past 2GB.
In theory, you could start a bunch of DOS sessions, each with access and committing 1GB of memory and once ram is full, it'll swap. In practice, those 32bit variables limit things.
I think VIRTUALADDRESSLIMIT is how much address space a (32 bit) process can use, so the higher the better, at least until it interferes with kernel (device drivers etc) and PCI space. My feeling is that IBM didn't quite finish things so we have to manually set it.
Then there is low and high memory, 16 bit programs are limited to 1GB of virtual memory, mapped to the lower 1GB, half of which is claimed by the kernel so 512MB of low memory, shared and private with the shared having a bunch of DLL's loaded before you even launch a program. So basically shared is DLL space.
I think each process gets its own private address space as well but I'm not sure.
Anyways, that's my understanding, much of it might be wrong, maybe someone can correct me but the bottom line is the most important part of the mem output is shared memory, especially low shared memory as that is what we usually run out of first.
It is possible to run out of address space as well. Linking xul.dll (Firefox) for a while would fail without virtualaddresslimit set to 3072, and with 1.5 Gb of real ram, I had to be careful not to run anything else as the swap file would overflow, now some of the Qt DLLs and source code seem to have the same problem and with 3.2GB's of ram accessible to the system, building Qt5, I saw the swap file grow by a few hundred MB's, not sure how big as I wasn't paying attention and it likely shrank before I noticed. Also have to limit the make jobs that are running, 2 instead of 5 on this 4 core system.