最近正式环境docker内服务出现内存溢出问题,想使用jdk自带的命令进行分析,但是发现不能使用jstack、jstat、jmap等命令。
/usr/lib/jvm/java-1.8-openjdk/bin # ./jstack 1
1: Unable to get pid of LinuxThreads manager thread
发现服务的pid=1,网上查询得知pid1-5为Linux的特殊进程。
pid=1 :init进程,系统启动的第一个用户级进程,是所有其它进程的父进程,引导用户空间服务。
pid=2 :kthreadd:用于内核线程管理。
pid=3 :migration,用于进程在不同的CPU间迁移。
pid=4 :ksoftirqd,内核里的软中断守护线程,用于在系统空闲时定时处理软中断事务。
pid=5 :watchdog,此进程是看门狗进程,用于监听内核异常。当系统出现宕机,可以利用watchdog进程将宕机时的一些堆栈信息写入指定文件,用于事后分析宕机的原因。
想要解决问题思路就是让启动的服务进程pid不能是1。可以将启动命令写成启动脚本进行启动,也可以先执行Linux的init命令进行初始化之后再执行启动命令。
分两种情况使用dockerfile文件进行配置的、使用docker-maven-plugin插件进行配置的。推荐使用dockerfile文件配置。。。因为网上资料多。。。
有dockerfile文件:
在entrypoint里执行写入的脚本启动项目 /docker-entrypoint.sh
# Docker image for Anaconda3-2019.03
# VERSION 0.0.1
# Author: bolingcavalry
### 基础镜像,使用alpine操作系统,openjkd使用8u201
FROM openjdk:8u201-jdk-alpine3.9
#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#path
ENV PATH /opt/conda/bin:$PATH
#安装必要的软件
#RUN apt-get update --fix-missing && apt-get install -y wget
RUN apk update && apk add wget
#下载下来的压缩文件名称
ENV NACOS_FILE_NAME nacos-server-1.1.0.tar.gz
#把启动时用到的文件准备好
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
#解压后的文件夹名称
ENV NACOS_FOLDER_NAME nacos
RUN wget https://github.com/alibaba/nacos/releases/download/1.1.0/nacos-server-1.1.0.tar.gz -O ~/$NACOS_FILE_NAME && \
tar -zxf ~/$NACOS_FILE_NAME -C ~/ && \
rm ~/$NACOS_FILE_NAME && \
chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 8848
不管通过什么方式 只要让启动命令不是第一个执行的就能解决问题。