听说你没法在 JRE 中使用 arthas?不,你可以

文章介绍了如何在只包含JRE的环境中使用Arthas进行问题排查,避免了需要切换到JDK的情况。通过分析Arthas的attach过程,探讨了JRE缺少tools.jar导致的问题,并提出了利用jattach工具加载Arthas代理的解决方案,从而在不更换JRE的情况下实现Arthas的使用,提高了问题排查的效率。

之前经常遇到的问题是,排查问题需要挂arthas,但客户用的是JRE,没法挂载arthas。就只能让客户更换成JDK,再重新部署、排查问题。

很多有用的现场,在这个过程中也会丢失,最终导致问题排查效率降低。于是就探索了下如何在JRE环境中,使用artahs。

复现问题

如果一个Bug 没法复现,研发大概率是无法修复的。—— by 网友

我们写一个Java例子和Dockerfile:

// ./src/main/java/Main.javapublicclassMain {
  publicstaticvoidmain(String[] args) throws Exception {
    while (true) {
      System.out.println("hello!");
      Thread.sleep(30 * 1000);
    }
  }
}
复制代码
# ./Dockerfile
FROM openjdk:8-jdk-alpine as builder
COPY ./ /app
WORKDIR /app/src/main/java/
# 编译java文件
RUN javac Main.java

# 运行时容器使用JRE
FROM openjdk:8-jre-alpine
RUN apk add bash curl busybox-extras
WORKDIR /app/src/main/java/
# 将arthas copy 到容器中
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
COPY --from=builder /app/src/main/java/ /app/src/main/java/
CMD ["java", "Main"]
复制代码

构建并正常启动应用,并尝试用arthas attach,此处为了便于了解原理,我们使用as.sh来执行:

$ # 构建镜像$ docker build . -t example-attach$ # 启动容器$ docker run --name example-attach --rm example-attach
$ # 在另一个终端进入容器,执行as.sh$ docker exec -it example-attach sh
/app/src/main/java $ /opt/arthas/as.sh
Arthas script version: 3.6.7
tools.jar was not found, so arthas could not be launched!
复制代码

行吧,咱们先用jdk运行下,先看下arthas是怎么attach起来的:

# 替换容器为JDK镜像并运行# 先启动Attach Listener
$ pid=1 ;\
  touch /proc/${pid}/cwd/.attach_pid${pid} && \
  kill -SIGQUIT ${pid} && \
  sleep 2 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值