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