Jvm Java第一次创建一个对象会比下一次创建这个对象慢

Jvm Java第一次创建一个对象会比下一次创建这个对象慢,jvm,jvm-hotspot,Jvm,Jvm Hotspot,我有一个关于创建java对象的问题 public static void main(String[] args) throws InterruptedException { for(int i =0;i<5;i++){ long now = System.currentTimeMillis(); RestTemplate httpClient = new RestTemplate(); System.out.println(Syste

我有一个关于创建java对象的问题

public static void main(String[] args) throws InterruptedException {
    for(int i =0;i<5;i++){
        long now = System.currentTimeMillis();
        RestTemplate httpClient = new RestTemplate();
        System.out.println(System.currentTimeMillis() - now);
    }
}
显然,第一次用了1084毫秒,但第二次只用了16毫秒。 为什么在Java中会发生这种情况?
谢谢你的帮助

代码是延迟加载的,类是延迟初始化的。需要加载的代码越多,初始化类的时间越长

如果这是一个问题,您可以对代码进行虚拟执行,以便第一次使用它时速度更快

注意:在这一点上,几乎没有任何代码被编译过,在调用足够多的时间进行编译之后,它可以快得多


在微基准测试方面,我会忽略前2-10秒,以及前20000个需要更长时间的调用。

我通过
javax.ws.rs.client.client=javax.ws.rs.client.ClientBuilder.newClient()进行了通信
在一个web应用程序中,我的日志记录了这个对象创建花费的时间,第一次几乎花费了3秒钟,如果我连续调用,这个对象创建得非常快,但当我在一分钟后调用时,这个对象再次创建花费了3秒钟。为什么一分钟后,这段时间就像第一次一样?非常感谢@vincentren我不认为您需要创建多个这样的客户机,因为您应该能够重用它们。我怀疑您正在触发GC或暂时耗尽资源。如何重用它们?当我在静态状态下使用这个对象时,我应该调用close方法,然后下一个请求我使用这个对象,它发生了一个异常,我关闭了这个对象。如果GC已清理,该对象是否应再次加载?@vincentren如果您希望重新使用某个对象,则无法将其关闭。如果它已被GC删除,那是因为您没有对它的引用,所以无法重用它。除非没有其他方法共享此资源,否则我不会使其成为静态的。对于每个需要它的线程,您可能会有一个这样的线程,并在线程不再需要它时关闭它。或者,您可以通过同步在线程之间共享一个,或者使用资源池。这取决于您打算如何使用此连接。
1084
16
7
12
5