w
wish611
V1
2023/05/02阅读:30主题:橙心
OpenJDK镜像运行jstack, 无法找到pid
最近在进行压测过程中,由于应用出现CPU占用率极高,想要进行排查,但应用采用Docker进行部署,当在容器内采用jstack
命令去查看线程情况时,却出现Unable to get pid of LinuxThreads manager thread
的错误。
1 问题描述
在以openjdk:8-jdk-alpine
为镜像基础打包生成的应用中,进入容器内,执行jstack
命令时出现Unable to get pid of LinuxThreads manager thread
的错误。

2 原因
当容器内java进程的pid为1时,通过OpenJDK8执行JDK命令调用底层时会提示Unable to get pid of LinuxThreads manager thread
。
3 解决方式
3.1 docker加启动参数
在启动容器的时候,加入init
参数,如下:
docker run -d --init --name docker-test -p 8080:8080 zsj/dockertest:0.0.1-SNAPSHOT
3.2 使用tini管理进程
镜像内安装tini
管理进程:
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
RUN apk --update --no-cache add tini
ENTRYPOINT ["tini"]
CMD java -jar app.jar
#ENTRYPOINT ["java","-jar","/app.jar"]
3.3 使用脚本
使用shell脚本启动应用: start.sh
:
# !/bin/bash
java -jar app.jar
修改Dockerfile:
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
COPY start.sh start.sh
RUN chmod +x /start.sh
CMD /start.sh
作者介绍
w
wish611
V1