渴望java类加载

Cog*_*gsy 7 java

我正在尝试对在各种硬件和操作系统平台上运行的JVM进行一些基准测试.我已经创建了一个算法来练习我感兴趣的JVM部分,并打算多次运行这个算法来找到一个不错的平均值.

当我运行基准测试时,我发现第一次运行比后续运行时间长得多:

132ms
86ms
77ms
89ms
72ms
Run Code Online (Sandbox Code Playgroud)

我怀疑这些类是懒得加载的,在第一次运行时会产生很大的开销.虽然这确实是我认为每个JVM都是独一无二的功能,但在这一点上我并不感兴趣.

是否有标准的命令行选项或属性来急切加载类?还是有人有其他理论吗?

Pet*_*rey 5

最简单的方法是忽略第一次运行.(如果这是一个有效的事情)注意:如果你运行相同的代码10,000次,它将进一步编译代码,你会得到更好的结果,所以你可能想忽略一些微基准测试的前10K结果.

一些JVM支持急切加载,但我不认为Sun的JVM会这样做.


Tof*_*eer 5

如果要强制加载类,请执行以下操作:

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)