恐怖的string+操作消耗

偶然翻到一本书,《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程序员面试宝典》之类的肤浅流派。

你可能感兴趣的:(虚拟机,面试,云计算,idea)