有时我听到人们讨论 Java 的启动时间。看来这是一个重要的性能方面。但它到底是什么?
- 它由什么组成?
- 动态类加载引起的类加载时间?
- 还是只编译 JVM 中的第一次编译开销?
- 还是在Java程序执行的开始阶段导致“缓慢”的其他原因?
那么,第二个问题是
- 如何测量Java程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?
我不知道我的问题是否以正确的方式提出;如果没有,请告诉我。谢谢!
启动时间没有正式定义。实际上,实际 IT 中使用的大多数术语都没有正式定义。(或者正式定义被忽略。)
但粗略地说,是从应用程序启动到准备好做一些有用的事情的时间。启动期间发生的事情取决于应用程序,但它包括静态类加载、静态类初始化和(可能)某些类的 JIT 编译。其他事情可能包括启动 UI、连接到数据库、预加载特定于应用程序的数据结构、应用程序“连接”等等。
尝试正式定义“启动时间”的问题在于,任何定义都可能不适用于某些重要的应用程序类型子集。即使您可以定义它,在应用程序宣布自己为“就绪”后,一些启动(或预热)任务可能会继续在后台发生,这很复杂。
(这不是 Java 特有的问题。考虑一下笔记本电脑的“启动”;即在打开它的电源和您的桌面完全可用之间会发生什么。)
如何测量 Java 程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?
这两个都由您决定,具体取决于您正在谈论的应用程序的类型,以及您希望将什么视为应用程序的启动阶段。
正如 Stephen C 提到的,“启动时间”没有通用的正式定义。
为了直观理解这个概念,我在Oracle 的网站上找到了一些描述。
基本上,它给出了一个非正式的定义。“应用程序的启动时间是应用程序启动并运行并准备开始执行它应该做的事情所花费的时间。 ” JVM 和应用程序本身都会影响启动时间。
此外,它提供了一些想法(调整堆大小-Xms/-Xmx)以减少启动时间。太大或太小的堆大小都会延长启动时间。
此外,“诊断缓慢的 JVM 启动”显示了一些线索来找出启动缓慢的原因。
注意以上都是在 JRockit JVM 的上下文中,但是思路比较笼统。