偶然翻到一本书,《Java程序员上班那点事儿》,按照其第四章的实例代码跑了一下string的“+”操作,测试数据真的有点恐怖。。
public class MemoryTest {
public static void main(String args[]) {
String s = "abcdefghijklmnop";
System.out.print(" 当前虚拟机最大可用内存为 :");
System.out
.println(Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");
System.out.print(" 循环前,虚拟机已占用内存 :");
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024
+ "M");
int count = 0;
while (true) {
try {
s += s;
count++;
} catch (Error o) {
System.out.println(" 循环次数 :" + count);
System.out.println("String 实际字节数 :" + s.length() / 1024 / 1024
+ "M");
System.out.print(" 循环后,已占用内存 :");
System.out.println(Runtime.getRuntime().totalMemory() / 1024
/ 1024 + "M");
System.out.println("Catch 到的错误 :" + o);
break;
}
}
}
}
默认情况下:
当前虚拟机最大可用内存为 :63M
循环前,虚拟机已占用内存 :4M
循环次数 :19
String 实际字节数 :8M
循环后,已占用内存 :63M
Catch 到的错误 :java.lang.OutOfMemoryError: Java heap space
配置Xms=1248m之后:
当前虚拟机最大可用内存为 :1238M
循环前,虚拟机已占用内存 :4M
循环次数 :23
String 实际字节数 :128M
循环后,已占用内存 :1238M
Catch 到的错误 :java.lang.OutOfMemoryError: Java heap space
那么StringBuffer的数据是不是就会好看了?运行一下下面这个代码,也会让人吃惊的:
public class MemoryTest2 {
public static void main(String args[]) {
StringBuffer s = new StringBuffer("abcdefghijklmnop");
System.out.print(" 当前虚拟机最大可用内存为 :");
System.out
.println(Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");
System.out.print(" 循环前,虚拟机已占用内存 :");
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024
+ "M");
int count = 0;
while (true) {
try {
s.append(s);
count++;
} catch (Error o) {
System.out.println(" 循环次数 :" + count);
System.out.println("String 实际字节数 :" + s.length() / 1024 / 1024
+ "M");
System.out.println(" 循环后,已占用内存 :");
System.out.println(Runtime.getRuntime().totalMemory() / 1024
/ 1024 + "M");
System.out.println("Catch 到的错误 :" + o);
break;
}
}
}
}
当前虚拟机最大可用内存为 :63M
循环前,虚拟机已占用内存 :4M
循环次数 :20
String 实际字节数 :
16M
循环后,已占用内存 :
63M
通常我们自认为看过一些文档就了解了全部真相,却未成去尝试“定量”分析。看到这个测试的数值之后还是触动很大的。当然,也说明这本书还是值得买一本看看的,绝对不是那种《java程序员面试宝典》之类的肤浅流派。