场景介绍

  • 在线上运行的应用程序,如果出现OOM等JVM异常,我们需要通过灾难现场来判断问题代码的所在
  • 如果现场具备JDK环境,则可以直接使用jmap jstack 这些内存分析工具进行问题的分析
  • 如果现场不具备JDK环境,比如基于Docker运行的Alpine的Java运行环境,一般不具备JDK环境

基于JRE环境运行的Docker容器JVM调优方法

联网环境

1
2
# 进入容器
sudo docker exec -it xxxx /bin/sh
1
2
# 更新apk源
echo https://mirrors.aliyun.com/alpine/v3.14/main > /etc/apk/repositories && echo https://mirrors.aliyun.com/alpine/v3.14/community >> /etc/apk/repositories
1
2
# 安装openjdk8
apk update && apk upgrade && apk add openjdk8
1
2
3
4
5
6
#进入openjdk8目录
cd /usr/lib/jvm/java-1.8-openjdk/bin

#执行命令
jps #列出Java进程
jstack 7 #查看堆栈信息

无网环境

在有网环境下按照上述步骤进行操作,然后将openjdk8拷贝到宿主机,将上述文件导入无网环境下,拷贝到容器中,即可进行JVM调优

1
2
sudo docker cp xxxxxxx:/usr/lib/jvm/java-1.8-openjdk .
sudo tar -zcvf java-1.8-openjdk.tar.gz java-1.8-openjdk

如若遇到权限问题,请自行赋予操作权限

1
2
sudo tar -zxvf java-1.8-openjdk.tar.gz
sudo docker cp java-1.8-openjdk xxxxxx:~