【发布时间】:2012-12-30 20:41:37
【问题描述】:
当我遇到一个奇怪的结果时,我正在对对象分配进行一些性能测试。我有以下java代码:
public static long TestMethod(){
int len = 10000000;
Object[] obs = new Object[len];
long t = System.nanoTime();
for (int i = 0; i < len; i++) {
obs[i] = new Object();
}
return System.nanoTime() - t;
}
public static void main(String... args) throws InterruptedException {
for(int i = 0; i < 10; i++){
System.gc();
System.gc();//Wait for the gc to be finished
Thread.sleep(1000);
System.out.println(TestMethod());
}
}
期望: 由于向操作系统请求更大的内存空间和热点增强,第一次调用会比第二次调用慢。但第二和第三几乎是一样的。
观察结果:
11284734000
799837000
682304000
304736000
380770000
392786000
374279000
381611000
379174000
407256000
在第三次和第四次迭代之间仍然有相当大的加速。是什么导致了这种加速?在测试其他函数时如何确保我的测量结果准确,是否必须在测量之前调用该函数四次以上?
【问题讨论】:
-
有趣的阅读:stackoverflow.com/questions/504103/… - 特别是,使用
-XX:+PrintCompilation -verbose:gcVM 参数运行将帮助您了解发生了什么。 -
@assylias:很有趣。不知道那些参数。它似乎在第二次调用中重新编译函数,并在前三个调用中进行了 2 次垃圾回收,最后一次调用在函数调用中不进行垃圾回收。
标签: java performance garbage-collection instrumentation jvm-hotspot