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需要110ms。 第二次通话需要0ms。
首先,如何为给定的类运行所有静态初始值设定项? 其次,有没有办法在我的应用程序提前引用的所有类中执行此操作?
我的应用程序对延迟非常敏感。
答案 0 :(得分:2)
这就是Java和JVM的工作原理 - 在最佳运行之前总是需要预热。您应该进行一些集成测试,以执行应用程序的所有部分,最好是以对数据无破坏的方式。然后在每次部署时对应用程序运行它们。这将使您确信该应用程序正在运行。
答案 1 :(得分: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
尝试创建实例不会更多地加载类。它可以加载默认构造函数(如果有的话),但只有那样才有用。
答案 2 :(得分:0)
看起来像静态初始化问题。尝试做
Class.forName("org.joda.time.LocalDate");
在你打电话之前。这应该减少时间。可能你需要强制加载其他相关的类。如果问题是动态初始化,这将无济于事。