问题现象
最近在处理项目上问题发现之前同事构建的AlpineLinux的镜像不能执行jstack等JDK命令,报错如下。
Unable to get pid of LinuxThreads manager thread
问题原因
问题的根本原因有两点:
- Alpine Linux 使用的不是标准gnu libc (glibc),而是musl libc
- apk包管理器安装的OpenJDK是IceTea补丁版本的,已经停止维护了
这两个原因导致了一个神奇的现象:当Java进程PID=1时,通过OpenJDK8执行JDK命令调用底层时会提示Unable to get pid of LinuxThreads manager thread,这个错误信息来源于Alpine仓库中OpenJDK源码中的一个失误,没处理musl libc仍去调用了glibc的底层接口导致的。
如下是亚马逊工程师对此仓库中底层OpenJDK8源码做的patch修复。
https://git.alpinelinux.org/aports/tree/community/openjdk8/icedtea-issue13032.patch

解决方法
解决方法有以下几种:
方案1、添加 docker 启动参数
启动容器命令参考如下:
docker

在Alpine Linux镜像中,由于使用musllibc而非glibc以及安装了不再维护的OpenJDK版本,导致执行JDK命令如jstack时出现错误。问题的根本原因在于OpenJDK源码对musllibc的支持不足。解决方案包括使用`--init`参数、添加tini管理进程、编写启动脚本或者安装glibc。推荐的解决方法是切换到基于glibc的基础镜像,如debian、ubuntu或centos。

3632

被折叠的 条评论
为什么被折叠?



