OpenJ9 和 docker 容器?

OpenJ9 and docker containers?

从历史上看,HotSpot 在 docker 容器中有 运行 错误判断分配的资源(例如 RAM)的不良记录。不过,情况正在慢慢好转。

OpenJ9 如何与 docker 容器保持一致,它在多大程度上了解容器提供的资源(内存、套接字、线程等)

此外,在 JavaOne 2017 演示期间,有人提到 OpenJ9 可以在不同的 OpenJ9 VM 之间缓存 jit 编译的 类。当 VM 被限制在不同的容器中时(或者)如果容器化的 JVM 共享一个 docker 卷,这种共享缓存是否可能?

  1. 目前正在开发容器支持,对于 cgroup 意识,请检查此 PR。这也将导致添加容器支持。
  2. 关于共享 Class 缓存 (SCC),这两种情况都是可能的。有关共享 docker 卷的示例,请参阅 here 中的 "Using the Class Data Sharing feature"。当 JVM 被限制在没有共享卷的不同容器中时,建议使用预构建的 SCC 构建 docker 容器。您的 docker 文件将如下所示。

    来自 adoptopenjdk/openjdk9-openj9:x86_64-alpine-jdk-9.181

    运行 mkdir /opt/shareclasses && mkdir /opt/app

    复制 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

可以创建共享 类 缓存并将其包含在 Docker 文件中

共享类缓存 可以在开发环境或预生产环境中创建,或者在对应用程序 运行 进行一些测试时 创建。 在 Pre-prod 中创建 缓存可能更有效 但在构建过程中使用测试 进行缓存 更简单。 我用 Spring Boot 应用程序和 甚至简单的 "contextLoads" 测试 测试了它,它包含在任何新生成的 Spring Boot 项目中 有很大的不同

这是一个使用 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>

虚拟机参数:-Xquickstart -Xshare类:cacheDir=classCache,name=appname -Xscmx32m

  • cacheDir 子选项用于 指定缓存文件夹 以便更容易包含在 Docker 图像中
  • name 子选项用于避免 难以预测的自动缓存名称
  • -Xscmx选项是为了限制缓存大小,这应该针对应用程序进行调整,启动和启动之间有一个权衡速度和图像大小
  • -Xquickstart 选项指示 JVM 在与 -Xshare类 结合使用时 尽可能多地执行 AOT选项

您可以使用 printStats 子选项检查 使用了多少缓存大小,如下所示:java -jar -Xshare类:cacheDir=classCache,name=appname,readonly,printStatsapplication.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 -Xshare类:cacheDir=classCache,name=appname,readonly -jar application.jar

可以使用 classCache 和名称子选项指定缓存,如果没有这些,JVM 可能会创建一个新的缓存文件夹并忽略添加到图片.

根据我的经验,readonly 选项使它 更快 一点,但这不是绝对必要的。由于当容器被销毁时此缓存将被删除,因此没有必要保留 canges。

-Xquickstart 和 -Xtune:virtualized 选项可以进一步优化容器中的启动速度