0
import org.joda.time.LocalDate;

public class Test {
    public static void main(String[] args) {
        long time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
        time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
    }
}

首次调用 new LocalDate 需要 110 毫秒。第二次调用需要 0ms。

首先,如何运行给定类的所有静态初始化程序?其次,有没有办法提前为我的应用程序引用的所有类执行此操作?

我的应用程序对延迟非常敏感。

4

3 回答 3

2

这就是 Java 和 JVM 的工作方式——在最佳运行之前它总是需要预热。您应该进行一些集成测试,以测试应用程序的所有部分,最好以不破坏数据的方式进行。然后在每次部署时针对应用程序运行它们。这将有一个好处是让您确信应用程序正在运行。

于 2012-07-03T08:46:45.893 回答
2

您可以获取加载的类列表-XX:+TraceClassLoading并将其保存到文件中。然后,您可以使用 Class.forName() 来确保所有这些类都已加载。

这将加载每个类并确保它们的静态块已被加载。

但是对于延迟敏感代码,您确实需要通过预热它来确保它已经被编译(即调用它足够的时间来触发编译)这可以将延迟进一步减少 10 倍或更多。


如果你跑

public class CallStatic {
    public static void main(String... args) throws ClassNotFoundException {
        Class.forName("Static");
    }
}

class Static {
    static {
        System.out.println("static block run");
    }
}

印刷

static block run

尝试创建一个实例不会加载更多的类。如果它有一个默认构造函数,它可能会加载它,但这只有在你想要的时候才有帮助。

于 2012-07-03T09:15:44.500 回答
0

看起来像静态初始化问题。尝试做

Class.forName("org.joda.time.LocalDate");

在你打电话之前。这应该减少时间。可能您需要强制加载其他相关类。如果问题是动态初始化,这将无济于事。

于 2012-07-03T08:41:26.837 回答