我正在尝试对在各种硬件和操作系统平台上运行的JVM进行一些基准测试.我已经创建了一个算法来练习我感兴趣的JVM部分,并打算多次运行这个算法来找到一个不错的平均值.
当我运行基准测试时,我发现第一次运行比后续运行时间长得多:
132ms 86ms 77ms 89ms 72ms
我怀疑这些类是懒得加载的,在第一次运行时会产生很大的开销.虽然这确实是我认为每个JVM都是独一无二的功能,但在这一点上我并不感兴趣.
是否有标准的命令行选项或属性来急切加载类?还是有人有其他理论吗?
最简单的方法是忽略第一次运行.(如果这是一个有效的事情)注意:如果你运行相同的代码10,000次,它将进一步编译代码,你会得到更好的结果,所以你可能想忽略一些微基准测试的前10K结果.
一些JVM支持急切加载,但我不认为Sun的JVM会这样做.
如果要强制加载类,请执行以下操作:
public class Main { static { loadClasses(); } public static void main(final String[] argv) { // whatever } private static void loadClasses() { final String[] classesToLoad; // even better, read them from a file and pass the filename to this method classesToLoad = new String[] { "foo.bar.X", "foo.bar.Y", } for(final String className : classesToLoad) { try { // load the class Class.forName(className); } catch(final ClassNotFoundException ex) { // do something that makes sense here ex.printStackTrace(); } } } }