Узнать объём памяти, занятой программой

Здравствуйте.
Как узнать объём памяти, занятой программой? Я делаю так:

    public static String divSize(long n) {
        final int KB = 1000;
        final int MB = 1000000;
        final int GB = 1000000000;
        final long TB = 1000000000000L;

        long b = n % KB;
        long kb = (n % MB) / KB;
        long mb = (n % GB) / MB;
        long gb = (n % TB) / GB;

        if (n >= 0 && n < KB)
            return String.format("%01d b", b);
        if (n >= KB && n < MB)
            return String.format("%01d,%03d KB", kb, b);
        if (n >= MB && n < GB)
            return String.format("%01d,%03d MB", mb, kb);
        if (n >= GB && n < TB)
            return String.format("%01d,%03d GB", gb, mb);

        return String.format("%01d %03d %03d %03d bytes", gb, mb, kb, b);
    }
        long memoryMax = Runtime.getRuntime().maxMemory();
        long memoryUsed = memoryMax - Runtime.getRuntime().freeMemory();
        t = "Memory used: " + Utils.divSize(memoryUsed) + " / " + Utils.divSize(memoryMax);

Но оно выдаёт примерно 10-15 мегабайт свободной памяти (постоянно колеблется), независимо от того, что стоит в параметре -Xmx. Таких значений просто не может быть. Ну никак!
Screenshot_trim

В килобайте если что 1024 байта. Соответственно в мегабайте 1024^2 и т.д.

В данный момент эта погрешность не важна. Вопрос про другое.

        t = "Memory used: " + memoryUsed + " / " + memoryMax;

Ну вот. Убрал я divSize. Показатели от этого правдоподобнее не стали. Вы бы мозги включали и тему читали перед тем как отвечать. Зачем флудить и отвечать мимо вопроса?

Почему не может? Что программа делает?

Создает tile-based мир и на каждом фрейме создаёт экземпляры объектов для проверки коллизии. Я пробовал создавать все объекты сразу, но тогда либо тормоза, либо сразу краш с out of memory.

Потому что в другой аналогичной программе (не моей) индикатор памяти ведёт себя по-другому. Там он пляшет от 50 до 90%.
Вот я и подумал, что что-то не так. Разве нормально, что память долбится в 99%? Еще немного и out of memory. Каким образом сборщик мусора успевает так быстро чистить память? :thinking:

Он вроде может не чистить пока не надо, почистить когда запросили память.

Вообще с измерением памяти всё не так просто
The 6 Memory Metrics You Should Track in Your Java Benchmarks | cruftex.net

Профайлеры могут помочь в подобных задачах (как минимум понять чем память занята).
A Guide to Java Profilers | Baeldung

Как же не надо, если память постоянно загружена на 95%? Наоборот, ему приходится её постоянно чистить.
Если, конечно, возвращенные значения не врут.

Странно как-то. За 40 лет истории программы не научились нормально замерять собственную память.

Ну я, в принципе, сам знаю чем. Я просто не пойму, в чем отличие от другой программы.
Наверное, придётся декомпилировать ту программу и искать, как они память замеряют.