为什么 JVM 启动速度更快 Java 12
Why JVM boots a bit faster starting Java 12
这是一个细微但明显的区别:
$ for j in {5..12}; do . chjdk $j; time (java -version; for i in {1..1000}; do java x >/dev/null; done); echo ""; done
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)
real 2m4.988s
user 0m59.832s
sys 0m18.856s
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
real 0m28.055s
user 0m24.012s
sys 0m4.216s
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
real 0m31.225s
user 0m24.836s
sys 0m3.564s
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
real 0m43.463s
user 0m35.948s
sys 0m6.516s
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
real 1m29.909s
user 1m37.892s
sys 0m12.972s
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
real 1m21.161s
user 1m24.412s
sys 0m13.044s
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
real 0m56.932s
user 1m8.892s
sys 0m9.516s
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode, sharing)
real 0m39.930s
user 0m38.876s
sys 0m9.520s
作为 Java 12 版本的一部分,有什么特别的变化吗?还是测量错误?
更新
确实 JVM 启动速度更快。感谢 LppEdd 和 Holger 的参考。
JEP 341 - Default CDS Archives.
当您启动 Java 应用程序时,正在加载数千个 类,这似乎是 JVM 减慢了启动速度。
Class 数据共享是从 JDK 8 Update 40 开始作为商业功能引入的功能。它允许您将所有启动 类 打包到特定的存档中格式,之后应用程序启动时间增加了。一段时间后,引入了 JEP 310: Application Class-Data Sharing,这使我们不仅可以对系统 类 进行相同的操作,还可以对应用程序进行相同的操作 类.
对于JDK 类,它看起来像这样。首先我们用 java -Xshare:dump
转储 类,然后启动应用程序,告诉它使用这个缓存:java -Xshare:on -jar app.jar
。而且启动速度也有一点提升
但是每次都写-Xshare: dump
似乎很奇怪,如果执行这个命令的默认结果在创建JDK分布的阶段是有点可预测的。根据文档,如果 Java 8 发行版是使用安装程序安装的,那么在安装时它应该 运行 为您提供必要的命令。但为什么?如何处理分发包,它不是以安装程序的形式分发的,而是以 zip 存档的形式分发的?
因为 JDK 12 CDS 存档将由发行版的创建者在链接后立即生成。即使是夜间构建(假设它们是 64 位和本机的,不用于交叉编译)。
从JDK11开始,默认启用-Xshare: auto
,这样的压缩包会被自动拾取。 因此,只需更新为JDK 12 即可加快应用程序的启动速度!
这可能与 JEP 341 - 默认 CDS 存档 有关,这是 JDK 12.
的新内容
Summary
Enhance the JDK build process to generate a class data-sharing
(CDS) archive, using the default class list, on 64-bit platforms.
Goals
Improve out-of-the-box startup time
...
据我所知,通过使用 -Xshare:dump
/ -Xshare:on
参数,即使在以前的版本中也可以实现相同的行为。
这个 JEP 只是让它成为默认值。
感谢 Holger 关于 Class Data Sharing 的 Oracle 文章。
这是一个细微但明显的区别:
$ for j in {5..12}; do . chjdk $j; time (java -version; for i in {1..1000}; do java x >/dev/null; done); echo ""; done
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)
real 2m4.988s
user 0m59.832s
sys 0m18.856s
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
real 0m28.055s
user 0m24.012s
sys 0m4.216s
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
real 0m31.225s
user 0m24.836s
sys 0m3.564s
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
real 0m43.463s
user 0m35.948s
sys 0m6.516s
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
real 1m29.909s
user 1m37.892s
sys 0m12.972s
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
real 1m21.161s
user 1m24.412s
sys 0m13.044s
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
real 0m56.932s
user 1m8.892s
sys 0m9.516s
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode, sharing)
real 0m39.930s
user 0m38.876s
sys 0m9.520s
作为 Java 12 版本的一部分,有什么特别的变化吗?还是测量错误?
更新
确实 JVM 启动速度更快。感谢 LppEdd 和 Holger 的参考。
JEP 341 - Default CDS Archives.
当您启动 Java 应用程序时,正在加载数千个 类,这似乎是 JVM 减慢了启动速度。
Class 数据共享是从 JDK 8 Update 40 开始作为商业功能引入的功能。它允许您将所有启动 类 打包到特定的存档中格式,之后应用程序启动时间增加了。一段时间后,引入了 JEP 310: Application Class-Data Sharing,这使我们不仅可以对系统 类 进行相同的操作,还可以对应用程序进行相同的操作 类.
对于JDK 类,它看起来像这样。首先我们用 java -Xshare:dump
转储 类,然后启动应用程序,告诉它使用这个缓存:java -Xshare:on -jar app.jar
。而且启动速度也有一点提升
但是每次都写-Xshare: dump
似乎很奇怪,如果执行这个命令的默认结果在创建JDK分布的阶段是有点可预测的。根据文档,如果 Java 8 发行版是使用安装程序安装的,那么在安装时它应该 运行 为您提供必要的命令。但为什么?如何处理分发包,它不是以安装程序的形式分发的,而是以 zip 存档的形式分发的?
因为 JDK 12 CDS 存档将由发行版的创建者在链接后立即生成。即使是夜间构建(假设它们是 64 位和本机的,不用于交叉编译)。
从JDK11开始,默认启用-Xshare: auto
,这样的压缩包会被自动拾取。 因此,只需更新为JDK 12 即可加快应用程序的启动速度!
这可能与 JEP 341 - 默认 CDS 存档 有关,这是 JDK 12.
的新内容Summary
Enhance the JDK build process to generate a class data-sharing (CDS) archive, using the default class list, on 64-bit platforms.Goals
Improve out-of-the-box startup time
...
据我所知,通过使用 -Xshare:dump
/ -Xshare:on
参数,即使在以前的版本中也可以实现相同的行为。
这个 JEP 只是让它成为默认值。
感谢 Holger 关于 Class Data Sharing 的 Oracle 文章。