循环一:
Object o;
for (int i = 0; i < 100; i++) {
o = new Object();
System.out.println(o.hashCode());
}
循环二:
for (int i = 0; i < 100; i++) {
Object o = new Object();
System.out.println(o.hashCode());
}
以前看很多博客,大多数都主张循环一的写法,依据是可以减少栈上变量的分配。
但是今天看了JVM的逃逸分析后,个人觉得循环二的写法要好点,因为变量没有逃逸出循环体外,在经过JIT编译优化后,Object对象可以被分配在栈上。这样就减少了GC次数,也减小了堆内存的使用压力。
看文档说jdk7后默认开启了逃逸分析,现在用的jdk8。
求问下大佬这样理解有没有错误?还有就是到底那个写法好点?
两种写法编译得到的字节码是一样的,不需要jit优化,编译器就已经处理好了,所以第二种可读性更好也更优
这里要更正的是,至少截止到目前的版本(Valhalla正式发布之前),只要是对象,都在堆上,不存在“对象被分配在栈上”