保留的大小= 0在Java转储中意味着什么?

时间:2018-11-01 11:37:54

标签: java jvm dump visualvm

使用JDK 1.8和VisualVM,我看到一个字符串的保留大小为0。根据this article,这意味着分配给该字符串的内存为0。这是否意味着该字符串已经为GC?如果已经是GC,为什么仍显示?如果不是,保留大小= 0是什么意思?是否表示“如果JVM GC此字符串,则只能获得0 KB的可用内存”?

示例代码为:

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";
    }
}

enter image description here

1 个答案:

答案 0 :(得分:3)

VisualVM中的“保留大小”是指下一个完整GC之后对象将在堆中占用的大小。

在您的情况下,当您到达上述Thread.sleep()方法时,“ wawawawa”字符串对象才有资格进行垃圾回收(您已将保存它的字符串字段设置为“ haha​​hahaha” ),因此在下一个完整GC之后将占用0个空间。那就是您在该屏幕截图中看到的。