Что означает сохраненный размер = 0 в дампе Java?

Используя JDK 1.8 и VisualVM, я увидел, что сохраненный размер строки равен 0. Согласно этому article, это означает, что память, выделенная для строки, равна 0. Означает ли это, что строка уже прошла сборку мусора? Если это уже был GC, почему он все еще отображается? Если нет, что означает сохраненный размер = 0? Означает ли это, что «если JVM GC эту строку, она может освободить только 0 КБ памяти»?

Пример кода:

public class Main {
    private static final Logger LOGGER = Logger.getLogger(Main.class.getName());
    private static ExecutorService executorService = Executors.newFixedThreadPool(3);

    public static void main(String[] args) throws InterruptedException {
        AAAAAAAA a = new AAAAAAAA();

        a.setString();
        Thread.sleep(55555555); // I dump it when it's asleep.
    }
}

class AAAAAAAA {
    String string = "wawawawa";

    public void setString() {
        string = "hahahahaha";
    }
}

введите здесь описание изображения


person guo    schedule 01.11.2018    source источник


Ответы (1)


«Оставшийся размер» в VisualVM относится к размеру, который объект займет в куче после следующего полного GC.

В вашем случае, к тому времени, когда вы доберетесь до вышеуказанного метода Thread.sleep(), строковый объект «wawawawa» подходит для сборки мусора (вместо этого вы установили строковое поле, которое содержало его, на «хахахахаха»), поэтому он займет 0 пробел после следующего полного GC. Это то, что вы видите на этом скриншоте.

person Michael Berry    schedule 01.11.2018
comment
Не могли бы вы предложить официальный документ или ссылку, чтобы доказать, что сохраненный размер в VisualVM относится к размеру, который объект займет в куче после следующего полного GC.? Я не могу найти при поиске в Google сохраненный размер visualvm - person guo; 01.11.2018