测量字符串对象大小 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();
所以第二种方法内存会增加。
我创建了如下两个测试方法。
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();
所以第二种方法内存会增加。