开发在排查问题时,使用arthas工具挂不上项目应用进程,说是我jdk环境有问题。我能说什么,百度解决卅

先看截图:

arthas启动报错:[ERROR] Start arthas failed,exception stack trace_java

有进程,选择挂进程的时候就报错!

其中原由就不说了,直接上解决办法:

第一种方法:临时的

#既然 attach 主要卡在了发送信号上,那我们就用 shell 来模拟这个流程:
touch /proc/1/cwd/.attach_pid1 && kill -SIGQUIT 1 && sleep 2 && ls /proc/1/root/tmp/.java_pid1

# 接下来就可以正常,挂arthas了 
java -jar arthas-boot.jar
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

第二种方法:改启动参数

Jvm 支持设置 -XX:+StartAttachListener,这样就能在启动 Jvm 的时候,自动启动 Attach Listener 线程并监听,也可以正常使用 arthas。

对于容器环境下,更加容易的做法是给容器添加环境变量 JAVA_TOOL_OPTIONS=-XX:+StartAttachListener,这样不用修改启动脚本也能达到效果。

第三种方法:改镜像

重新构建openjdk镜像,但是这个我构建等了10来分钟,都没构建完成,我就放弃了。可能是我网络原因。

cat <<EOF > Main.java
public class Main {
        public static void main(String[] args) {
                while(true) {
                }
        }
}
EOF

cat <<EOF > Dockerfile
FROM alpine:latest
RUN apk add openjdk8
ADD Main.java ./
RUN /usr/lib/jvm/java-8-openjdk/bin/javac Main.java
ENTRYPOINT java Main
EOF

docker build . -t test-image
docker run test-image
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

最终,我选择了第二种方法,

由于我的是容器所以我在构建项目应用镜像的时候加了个环境变量就得到解决了!

FROM openjdk:8-jdk-alpine
ADD target/*.jar /app.jar
ENV JAVA_TOOL_OPTIONS=-XX:+StartAttachListener
ENTRYPOINT ["java","-jar", "-Dfile.encoding=utf-8","/app.jar"]
  • 1.
  • 2.
  • 3.
  • 4.

启动arthas挂载进程的截图:

arthas启动报错:[ERROR] Start arthas failed,exception stack trace_jar_02