Java JodaTime在第一次通话时非常慢

Java JodaTime在第一次通话时非常慢,java,performance,static,jodatime,Java,Performance,Static,Jodatime,第一次调用new LocalDate需要110毫秒。 第二次呼叫需要0毫秒 首先,如何运行给定类的所有静态初始值设定项? 其次,是否有一种方法可以提前为我的应用程序引用的所有类执行此操作 我的应用程序对延迟非常敏感。看起来像是静态初始化问题。试着做 import org.joda.time.LocalDate; public class Test { public static void main(String[] args) { long time=System.cu

第一次调用new LocalDate需要110毫秒。 第二次呼叫需要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);
    }
}

在你打电话之前。这将减少时间。可能需要强制加载其他相关类。如果问题是动态初始化,这将没有帮助。

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

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);
    }
}

在你打电话之前。这将减少时间。可能需要强制加载其他相关类。如果问题是动态初始化,这将不会有帮助。

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

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

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

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

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


如果你跑

Class.forName("org.joda.time.LocalDate");
印刷品

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

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

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

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

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

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


如果你跑

Class.forName("org.joda.time.LocalDate");
印刷品

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

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


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

这比
new LocalDate();//更好或更可读吗确保类已初始化
?如何在没有字符串的情况下执行此操作,以便更好地进行重构?@DD class.forName(LocalDate.class.getName());这不太好用,因为我需要加载很多其他类…这似乎比LocalDate.class.newInstance()更好用;这比
newlocaldate();/)更好或更可读吗确保类已初始化
?如何在没有字符串的情况下执行此操作,以便更好地进行重构?@DD class.forName(LocalDate.class.getName());这不太好用,因为我需要加载很多其他类…这似乎比LocalDate.class.newInstance()更好用;我不知道集成测试将如何影响生产代码的性能?它们是在单独的环境/VM中部署之前运行的。您应该针对生产版本再次运行它们(小心!!)。(只有在非破坏性的情况下才这样做)这听起来是个坏主意!当然,运行初始化代码并使测试过程不在生产环境中会更好。您只是重新确定了测试的目的。当然,这取决于他们写得有多好。由你决定。我不知道集成测试将如何影响生产代码的性能?它们是在单独的环境/VM中部署之前运行的。您应该针对生产版本再次运行它们(小心!!)。(只有在非破坏性的情况下才这样做)这听起来是个坏主意!当然,运行初始化代码并使测试过程不在生产环境中会更好。您只是重新确定了测试的目的。当然,这取决于他们写得有多好。由您决定。如果应用程序对延迟敏感,您可能希望在加载代码的同时预热代码。e、 g.运行10000次左右,以确保代码已编译。我还将使用System.nanoTime()来获得更好的分辨率。你应该在服务可用之前在启动时执行此操作。我如何提前运行代码。如果代码正在写入DB?是否有方法获取所有被引用/导入的类的列表?如果可以,我不会在应用程序最关键的延迟部分使用数据库。如果必须,可以多次不向数据库写入任何内容。e、 g.不更新任何内容。在JodaTime的情况下,您可以创建10000个LocalDate对象,但最好确定应用程序的整个关键路径,并在可能的情况下对其进行预热。获取列表并不容易,也不会对您有多大帮助,因为JIT会根据其使用方式编译代码。你不能只预热一系列的类。如果应用程序对延迟敏感,你可能需要在加载代码的同时预热代码。e、 g.运行10000次左右,以确保代码已编译。我还将使用System.nanoTime()来获得更好的分辨率。你应该在服务可用之前在启动时执行此操作。我如何提前运行代码。如果代码正在写入DB?是否有方法获取所有被引用/导入的类的列表?如果