sbool linux_rssFixedForZGC_verbose; static long linux_rssFixedForZGC() { ret linux_rssFixedForZGC(processID_int()); } static long linux_rssFixedForZGC(int pid) { S text = loadTextFile("/proc/" + pid + "/smaps"); S range = null; new TreeMap rssByRange; for (S s : lines(text)) { S addr = regexpFirstGroupIC("^([0-9a-f]{1,16})-", s); if (addr != null) { addr = lpad(addr, 16, '0'); //print("Have address: " + addr); S cleanedAddr = longToHex(parseUnsignedHexLong(addr) & ~((1L << 42)-1)); //range = takeFirst(/*7*/6, addr); range = takeFirst(6, cleanedAddr); continue; } // else print("Not range: " + s); PairS p = parseColonProperty(s); if (eqic(pairA(p), "rss")) { long size = parseFirstLong(p.b); if (size != 0) rssByRange.put(range, getOrCreate_long(rssByRange, range) + size); } } if (linux_rssFixedForZGC_verbose) for (unpair S _range, long size : mapToPairs(rssByRange)) { print("Address range " + rpad(_range, 16, 'x') + ": " + toK(size) + " MB"); } L offendingRanges = ll( toLong(rssByRange.get("000004")), toLong(rssByRange.get("000008")), toLong(rssByRange.get("000010"))); long total = longSum(values(rssByRange)); long offending = longMin(offendingRanges); long guess = total-offending*2 /*3*/; // seems 2 is the right one /* Bad fix (?) for this situation: Address range 000000xxxxxxxxxx: 1 MB Address range 000004xxxxxxxxxx: 2461 MB Address range 000008xxxxxxxxxx: 2476 MB Address range 000010xxxxxxxxxx: 2662 MB Address range 00007cxxxxxxxxxx: 648 MB */ /*long high = toLong(rssByRange.get("00007c")); if (high < offending*2) guess += offending;*/ ret guess*1024; }