I must not have understood correctly but in this case the ram displayed is indeed 0.315GB and -max 3 it should take 900 MB or even 1 GB but it took 352 MB exactly 352055KB, why?

Because there is some fixed RAM size required to store table itself (about 200MB):
if (gMax > 0)
{
MaxTotalOps = gMax * ops;
double ram_max = (32 + 4 + 4) * MaxTotalOps / dp_val; //+4 for grow allocation and memory fragmentation
ram_max += sizeof(TListRec) * 256 * 256 * 256; //3byte-prefix table
ram_max /= (1024 * 1024 * 1024); //GB
printf("Max allowed number of ops: 2^%.3f, max RAM for DPs: %.3f GB\r\n", log2(MaxTotalOps), ram_max);
}