Windows下使用--add-options时jlink创建的运行时挂起问题
问题复现
使用JDK 11.0.15自带jlink执行如下命令构建自定义运行时:
C:\oracle\jdk-11.0.15\bin\jlink --add-modules ALL-MODULE-PATH --output jre --strip-debug --no-man-pages --no-header-files --compress=2 --module-path "C:\oracle\jdk-11.0.15\jmods" --output compressedrt --add-options="-Xmx64m"
构建完成后执行验证命令:
compressedrt\bin\java.exe -version
进程会直接挂起无任何响应。
- 该问题仅在配置
--add-options参数时触发,移除该参数后构建的运行时可正常使用 - 换用JDK 17.0.3.1执行参数完全一致的jlink命令,构建出的运行时无该问题,可正常执行:
C:\oracle\jdk-17.0.3.1\bin\jlink --add-modules ALL-MODULE-PATH --output jre --strip-debug --no-man-pages --no-header-files --compress=2 --module-path "C:\oracle\jdk-17.0.3.1\jmods" --output compressedrt --add-options="-Xmx64m"
根因说明
这是JDK 11早期更新版本中jlink工具的实现Bug:当--add-options的参数值用双引号包裹时,引号会被错误写入生成的运行时启动配置中,导致JVM启动时读取到非法格式的启动参数,进入死锁挂起状态,不会抛出任何可见报错。该缺陷在JDK 12及之后的大版本中完成修复,最初没有向后移植到JDK 11的早期补丁中,因此在JDK 11.0.15版本上可以稳定复现。
解决方法
二选一即可:
- 保留当前JDK 11.0.15版本的前提下,去掉
--add-options参数值的外层双引号,把参数写为--add-options=-Xmx64m即可。如果需要配置多个JVM参数,直接在等号后用空格分隔多个参数即可,不需要额外加引号,例如--add-options=-Xmx64m -Xms32m,构建出的运行时参数可正常生效,不会出现挂起问题。 - 将使用的JDK 11升级到11.0.16及之后的更新补丁版本,该问题已经在后续JDK 11的官方补丁中修复,不需要调整命令参数写法;也可以直接使用JDK 17及以上版本构建自定义运行时。
内容的提问来源于stack exchange,提问作者Sergey Rymsha
相关产品推荐
相关产品推荐

