可以创建共享类缓存并将其包含在 Docker 文件中。
共享类缓存可以在开发或预生产环境中创建,或者在应用程序上运行一些测试时。
在 Pre-prod 中创建缓存可能更有效,但是在构建过程中通过测试来实现它要简单得多。
我使用 Spring Boot 应用程序对其进行了测试,即使是任何新生成的 Spring Boot 项目中包含的简单“contextLoads”测试都会产生巨大的影响。
这是一个使用 Maven 进行测试的示例,但同样的 VM 选项也可以用于不同的场景。
1.在启用共享类缓存的情况下运行测试:
你可以在 Maven 中使用 Surefire 插件来完成,我不确定如何使用 Gradle 来完成
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xquickstart -Xshareclasses:cacheDir=classCache,name=appname -Xscmx32m </argLine>
</configuration>
</plugin>
VM 参数:-Xquickstart -Xshareclasses:cacheDir=classCache,name=appname -Xscmx32m
-
cacheDir 子选项用于指定缓存文件夹,以便更轻松地包含在 Docker 映像中
-
name 子选项用于避免难以预测的自动缓存名称
-
-Xscmx 选项用于限制缓存大小,这应该针对应用程序进行调整,在启动速度和图像大小之间进行权衡
-
-Xquickstart 选项指示 JVM 在与 -Xshareclasses 选项结合使用时尽可能多地执行 AOT
您可以使用 printStats 子选项检查使用了多少缓存大小,如下所示:java -jar -Xshareclasses:cacheDir=classCache,name=appname,readonly ,printStats application.jar
2。将预热缓存添加到 Docker 映像
只需将cacheDir子选项设置的目录添加到图片中在本例中为classCache
ADD classCache classCache
由于这些文件每次都会改变,classCache应该最后添加到图像中
并且使用缓存运行应用程序
ENTRYPOINT exec java -Xquickstart -Xtune:virtualized -Xshareclasses:cacheDir=classCache,name=appname,readonly -jar application.jar
VM 参数:-Xquickstart -Xtune:virtualized -Xshareclasses:cacheDir=classCache,name=appname,readonly -jar application.jar
缓存可以通过classCache和name子选项指定,没有这些,JVM可能会创建一个新的缓存文件夹并忽略添加到图像中的那个。
根据我的经验,readonly 选项使它有点更快,但这不是绝对必要的。因为当容器被销毁时这个缓存会被删除,所以没有必要持久化这些canges。
-Xquickstart 和 -Xtune:virtualized 选项可进一步优化容器中的启动速度