代码之家  ›  专栏  ›  技术社区  ›  guo

在Java转储中保留大小=0意味着什么?[副本]

  •  1
  • guo  · 技术社区  · 6 年前

    使用JDK1.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 回复  |  直到 6 年前
        1
  •  3
  •   Michael Berry    6 年前

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

    在你的情况下,当你到达上面的时候 Thread.sleep() 方法,“wawawa”字符串对象可用于垃圾收集(您已将保存它的字符串字段设置为“hahahahaha”),因此在下一个完整GC之后它将占用0个空间。这就是你在屏幕截图中看到的。