使用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";
}
}
答案 0 :(得分:3)
VisualVM中的“保留大小”是指下一个完整GC之后对象将在堆中占用的大小。
在您的情况下,当您到达上述Thread.sleep()
方法时,“ wawawawa”字符串对象才有资格进行垃圾回收(您已将保存它的字符串字段设置为“ hahahahaha” ),因此在下一个完整GC之后将占用0个空间。那就是您在该屏幕截图中看到的。