历史上,HotSpot在docker容器中运行的记录不佳,错误地判断了分配的资源(例如RAM)。然而,事情正在慢慢改善。
OpenJ9如何与docker容器对齐,以及它知道容器提供的资源(内存,套接字,线程等)的范围
此外,在JavaOne 2017演示期间,提到OpenJ9可以跨不同的OpenJ9 VM缓存jit-compilled类。如果容器化的JVM共享一个docker卷,那么当VM被限制在不同的容器(或)时,这个共享缓存是否可行?
答案 0 :(得分:2)
关于共享类高速缓存(SCC),两种方案都是可能的。有关共享泊坞窗卷的示例,请参阅here中的“使用类数据共享功能”。当JVM被限制在没有共享卷的不同容器时,建议使用预构建的SCC构建docker容器。你的dockerfile看起来像这样。
FROM adoptopenjdk / openjdk9-openj9:x86_64-alpine-jdk-9.181
运行mkdir / opt / shareclasses &安培;&安培; mkdir / opt / app
COPY japp.jar / opt / app
CMD [“java”,“ - Xshareclasses:cacheDir = / opt / shareclasses”,“ - jar”,“/ opt / app / japp.jar”]
然后,您需要构建并运行图像并提交生成的容器,并将其作为基本图像。
docker build -t japp:latest .
docker run japp
docker commit container_id japp
答案 1 :(得分:0)
可以创建一个共享类缓存并将其包含在Docker文件中。
共享类缓存可以在开发环境或预生产环境中创建,也可以在应用程序上运行某些测试时创建。 在Pre-prod中创建缓存可能会更有效,,但是在构建过程中通过测试进行测试 要简单得多。 我用一个Spring Boot应用程序对其进行了测试,并且任何新生成的Spring Boot项目都随附了简单的“ contextLoads”测试。
这是使用Maven进行测试的示例,但是相同的VM选项也可以在不同的情况下使用。
1。在启用共享类缓存的情况下运行测试:
您可以使用Surefire插件在Maven中完成此操作,我不确定如何使用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
您可以使用 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
虚拟机参数:-Xquickstart -Xtune:虚拟化-Xshareclasses:cacheDir = classCache,name = appname,只读-jar application.jar
可以使用 classCache和name子选项来指定缓存,不使用这些选项,JVM可能会创建一个新的缓存文件夹,而忽略添加到映像中的那个。 < / p>
根据我的经验,只读选项使该操作更快,但这并不是绝对必要的。由于在销毁容器时将删除此缓存,因此无需持久保存容器。
-Xquickstart和-Xtune:virtualized 选项可以进一步优化容器中的启动速度