Java虚拟机的启动时间由啥组成?

Posted

技术标签:

【中文标题】Java虚拟机的启动时间由啥组成?【英文标题】:What does the start-up time compose of in Java virtual machine?Java虚拟机的启动时间由什么组成? 【发布时间】:2012-06-15 00:58:38 【问题描述】:

有时我听到人们讨论 Java 的启动时间。看来这是一个重要的性能方面。但它到底是什么?

它由什么组成?
    动态类加载导致的类加载时间? 还是在只编译 JVM 中的首次编译开销? 或者其他导致 Java 程序执行初期“缓慢”的原因?

那么,第二个问题是

如何测量Java程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?

我不知道我的问题是否以正确的方式提出;如果没有,请告诉我。谢谢!

【问题讨论】:

我一直听到这个术语被非正式地提及,我很好奇是否有人为它确定了一个正式的定义。 【参考方案1】:

启动时间没有正式定义。事实上,实际 IT 中使用的大多数术语都没有正式定义。 (或者忽略正式定义。)

但粗略地说,是从应用程序启动到准备好做一些有用的事情的时间。启动期间发生的事情取决于应用程序,但它包括静态类加载、静态类初始化和(可能)一些类的 JIT 编译。其他事情可能包括启动 UI、连接到数据库、预加载特定于应用程序的数据结构、应用程序“连接”等等。

尝试正式定义“启动时间”的问题在于,对于某些重要的应用程序类型子集,任何定义都可能不起作用。即使您可以定义它,在应用程序宣布自己为“就绪”后,一些启动(或预热)任务可能会继续在后台发生,这很复杂。

(这不是 Java 特定的问题。考虑一下笔记本电脑的“启动”;即在打开它的电源和您的桌面完全可用之间会发生什么。)

如何测量 Java 程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?

这两个都由您决定,具体取决于您所谈论的应用程序的类型,以及希望将什么视为应用程序的启动阶段。

【讨论】:

【参考方案2】:

正如 Stephen C 提到的,“启动时间”没有通用的正式定义。

为了直观理解这个概念,我在Oracle's webs上找到了一些描述。

基本上,它给出了一个非正式的定义。 “应用程序的启动时间是应用程序启动并运行并准备开始执行它应该执行的操作所需的时间。” JVM 和应用程序本身都会影响启动-正常运行时间。

另外,它提供了一些想法(调整堆大小-Xms/-Xmx)来减少启动时间。太大或太小的堆大小都会延长启动时间。

此外,“Diagnosing a Slow JVM Startup”显示了一些线索,可以找到启动缓慢的原因。

注意以上都是JRockit JVM的上下文,但是思路比较笼统。

【讨论】:

以上是关于Java虚拟机的启动时间由啥组成?的主要内容,如果未能解决你的问题,请参考以下文章

JVM_01 虚拟机的组成部分

一文了解JAVA虚拟机的重要组成

一文了解JAVA虚拟机的重要组成

Java虚拟机的初步了解

Java虚拟机的体系结构

JVM学习---JVM的生命周期