测量字符串对象大小 Java

Measure string object size Java

我创建了如下两个测试方法。

private static long usedMem = 0;
private static long newUsedMem = 0;

public static long getSize() {
    System.gc();
    usedMem = Runtime.getRuntime().totalMemory() 
            - Runtime.getRuntime().freeMemory();
    String s = "test";
    String y = "testabcd";

    System.gc();
    newUsedMem = Runtime.getRuntime().totalMemory() 
            - Runtime.getRuntime().freeMemory();

    return newUsedMem - usedMem;
}

public static long getSize2() {
    System.gc();
    usedMem = Runtime.getRuntime().totalMemory() 
            - Runtime.getRuntime().freeMemory();
    String s = "test";
    String y = s+"abcd";

    System.gc();
    newUsedMem = Runtime.getRuntime().totalMemory() 
            - Runtime.getRuntime().freeMemory();

    return newUsedMem - usedMem;
}

我预计这两种方法应该提供相同的结果,因为它们测量字符串 x 和字符串 y 的大小。但是,第一种方法不断地 returns 0,而第二种方法不断地 returns 56(我 运行 每个方法循环 10 次以确保 System.gc() 有效)。

另外注意,第一种方法中,不管字符串s和y有多长,结果总是0。

谁能给我解释一下区别?

第一个仅使用始终存在的字符串文字(在 class 初始化期间由 class 加载程序加载),因此分配不会增加内存。

第二个只在第二次赋值时增加内存,同理

执行一堆字符串连接时,Java 编译器会静默转换

String a = b + c + d;

进入

String a = new StringBuilder(b).append(c).append(d).toString();

所以第二种方法内存会增加。