I assume this is due to -maxMem= being parsed into a (signed!) int32_t which is then left shifted by 20. This results in values >= 2048 to wrap around to negative values. Using -maxMem=6143 apparently produces the same behaviour as -maxMem=2047, since the value overflows by exactely the range of an (u)int32_t (2047+4096 = 6143).