适用于 Java 的 Azure 命令启动器(公共预览版)

适用于 Java 的 Azure 命令启动器(jaz)是一种轻型实用工具,可简化 Java 开发人员在 Azure 上运行应用程序的方式。 通过智能地应用专为云环境定制的 Java 虚拟机(JVM)选项,该工具可减少配置开销,并现成提高资源利用率,并具有更高的性能潜力。

此工具非常适合以下开发人员:

  • 想要更好的 JVM 默认值,而无需深入探讨优化指南。
  • 使用 Spring Boot、Quarkus 或 Micronaut 等框架开发和部署云本机微服务。
  • 首选基于容器的工作流,例如 Kubernetes 和 OpenShift。
  • 在 Azure 容器应用、Azure Kubernetes 服务、Azure Red Hat OpenShift 或 Azure 虚拟机上部署 Java 工作负荷。

主要功能

  • 🛠 自动优化调整用于云原生部署的 JVM 参数。
  • 🚀 即插即用体验。 只需放入 Dockerfile 或启动脚本,即可将 java 命令替换为 jaz
  • ☁️ 针对 Azure 环境进行优化。
  • 🔧 可通过环境变量进行自定义。 可通过多种方式安全地推出配置更改。

支持的环境

只要 Java 启动器在基于 Linux 的环境中可用,就可以使用 Azure 命令启动器。 它已通过以下 Azure 和 CI/CD 平台进行验证和测试:

  • Azure Kubernetes 服务 (AKS)
  • Azure 容器应用
  • Azure App 服务
  • Azure Functions
  • Azure Red Hat OpenShift (ARO)
  • Azure 虚拟机
  • Azure DevOps
  • GitHub Codespaces
  • GitHub Actions

公共预览

适用于 Java 的 Azure 命令启动器现在以公共预览版提供! 阅读 公共预览版公告 ,了解此工具及其优势。

工作原理

适用于 Java 的 Azure 命令启动器位于容器或虚拟机启动命令与 JVM 之间。 启动该工具时,它会:

  1. 检测云环境(例如容器限制和可用内存)。
  2. 分析工作负荷类型并选择最适合 JVM 优化标志,例如:
    • 堆大小设定。
    • 垃圾回收器选择和调优。
    • 根据需要配置日志记录和诊断设置。
  3. 启动 Java 进程,向其传递优化标志和任何用户提供的参数。
  4. 不显式地中继 stdout、stderr、stdin 和 OS 信号,在 Java 进程之间传递。
  5. 监视 Java 进程并在终止时中继其退出代码。

示例用法

用于 Java 的 Azure 命令启动器是命令的删除替换 java ,无需更改代码。 只需在启动脚本中替换为 javajaz ,例如替换为 java -jar foo.jarjaz -jar foo.jar

而不是手动优化 JVM 选项:

JAVA_OPTS="-XX:... several JVM tuning flags"
java $JAVA_OPTS -jar myapp.jar

使用 jaz

jaz -jar myapp.jar

应用程序可能会从以下项中自动受益:

  • 久经考验的默认值,适用于云原生和容器工作负载。
  • 减少了云中的内存浪费。
  • 更好的启动和预热性能。

安装

适用于 Java 的 Azure 命令启动器适用于 x64 和 arm64 Linux。 支持的安装方法包括:

容器映像

该工具包含在 openJDK 的Microsoft版本的容器映像中。 无需进行更多设置。

例如,此 Dockerfile 用于通过 jaz 文件运行 jar Java 应用程序。

# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu

# Add your application.jar
COPY application.jar /application.jar

# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]

在 Azure Linux 上安装

使用以下命令安装 jaz 包:

sudo tdnf install jaz

从适用于 Microsoft 产品的 Linux 软件存储库安装

如果已为 Microsoft 产品设置 Linux 软件存储库,请运行分发版的相应包管理器命令以安装 jaz 包。

否则,请在以下列表中找到与 Linux 分发版匹配的说明。 按照说明进行操作,但安装jaz而不是msopenjdk-25包。

支持的 JVM 版本

适用于 Java 的 Azure 命令启动器支持基于 OpenJDK 的生成,并已通过以下方法进行测试:

配置

jaz 命令不消耗任何用于其自身配置的命令行参数。 相反,默认情况下,它将所有参数直接传递给 java 命令。 为了确保jaz配置不会干扰应用程序的命令行参数,jaz仅通过环境变量接受配置。

jaz命令可以使用以下环境变量配置:

环境变量 说明
JAZ_HELP 设置为 1 打印帮助消息并使用代码 0退出。
JAZ_PRINT_VERSION 设置为 1 打印 jaz 到 stdout 的版本,并使用代码 0退出。
JAZ_DRY_RUN 1设置为打印将执行的java命令,并以1代码退出。
JAZ_BYPASS 将其设置为 1 以绕过 jaz 的优化调整。 对遥测没有影响。
JAZ_IGNORE_USER_TUNING 设置为 1 以忽略所有用户提供的调优标志,改用 jaz 调优。 否则,jaz 只有在 JVM 检测到没有用户提供的调整标志时,才会调整 JVM。 关于启用或不启用此设置时jaz的行为的详细信息,请参阅“如果我已在我的环境中设置了一些 JVM 选项,会发生什么情况?”
JAZ_EXIT_WITHOUT_FLUSH 设置为 1 以在退出时跳过刷新遥测数据。 这可以避免 jaz 在刷新数据时可能会引入的潜在延迟(最多 30s),然而 jaz 仍可能会发送遥测数据。

使用环境变量而不是命令行参数也使在某些情况下更易于配置 jaz 。 部署容器化应用程序时,设置环境变量有时比修改启动脚本更容易,而在评估jaz时,尝试使用JAZ_IGNORE_USER_TUNINGJAZ_BYPASS可能会很有用。

路线图

  • ⚙️ JVM 配置概要
  • 📦 AppCDS 支持
  • 🔄 持续调优
  • 📊 遥测
  • 📦 Leyden 支持

Changelog

公共预览版 1:0.0.0-preview+20251118.1

  • 实现 RPM 和 DEB 包。
  • 改进垃圾回收器的内存释放调整。
  • 当 Java 程序以非零返回码退出时,停止输出不明确的诊断信息。
  • 改进 OS 到 Java 进程的信号转发,例如,SIGTERMSIGINT
    • 停止运行 Java 应用程序的容器现在可让应用程序正常关闭。
  • 删除使用 PrintFlagsFinal并改进与某些 Java 应用程序的兼容性。
    • 修复对 System.console() 引发异常的调用。
    • 修复 stdout 流缓冲: jaz 在看到换行符之前,不再延迟中继输出。
  • 对内部稳定性的其他错误修复和改进。

私有预览版 2

  • 问题修复。
  • 通过减少 glibc 要求扩展 Linux 发行版兼容性。
  • jaz 现在检测是否存在任何手动 JVM 优化,在这种情况下,它不会应用自己的调整。
  • JAZ_IGNORE_USER_TUNING=1 如果存在,则忽略手动 JVM 优化,并改为应用 jaz 自己的优化调整。
  • 修复了在使用 OpenJDK HotSpot JVM 8 和 PrintFlagsFinal 时出现(未请求的)jaz 输出的问题。

私有预览版 1

  • 适用于 Java 的 Azure Command Launcher 的初始版本。

遥测

用于 Java 的 Azure Command Launcher 收集使用情况数据并将其发送到Microsoft,以帮助改进我们的产品和服务。 若要了解详细信息,请阅读我们的 隐私声明