我以前心里有一个这样的想法,那就是假如一个方法是要被循环(可能是无限循环)调用的,那么这种做法将是愚蠢的:那就是在该方法中写new ,因为这样的话因为是很多次循环,如果这样不停的new 的话,那内存一定会被吃光的。可是我刚才式了一下这个程序:
- Java code
import java.util.regex.Matcher;import java.util.regex.Pattern;public class test { public static void main(String args[]) { int count = 100000 * 100000000; for (int i = 0; i < count; i++) { new test(); System.out.println(i); } } private static String translate(String original) { StringBuffer newStr = new StringBuffer(""); Pattern p = Pattern.compile("[A-Za-z0-9\\s]"); char[] chars = new char[1]; Matcher m; for (int i = 0; i < original.length(); i++) { chars[0] = original.charAt(i); m = p.matcher(new String(chars)); if (!m.matches()) newStr.append(" ").append(original.charAt(i)).append(" "); else newStr.append(original.charAt(i)); } return newStr.toString(); }}
为什么内存没有爆掉?
------解决方案--------------------------------------------------------
new test();执行完之后新创建的对象就是垃圾了,可以gc掉。再者,循环次数很多,到达一定程度之后jit可以把这句没有意义的话优化掉,根本不分配对象。