docker 中启动java微服务报错:java.lang.OutOfMemoryError

docker的容器调整

记一场由docker容器“ java.lang.OutOfMemoryError”引发的环境“雪崩”_西风未眠的技术博客_51CTO博客

限制docker内存。重新优化了docker容器,限制了docker内存的使用量,减少docker容器过度占用宿主机资源的风险

方法一:静态修改 -m
-m参数:限制docker容器最大使用内存

例如:$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash
上面的 docker run 命令中通过 -m 选项限制容器使用的内存上限为 300M。
同时设置 memory-swap 值为 -1,它表示容器程序使用内存的受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。

** 方法二:动态修改 docker update**
docker update 动态修改docker容器内存

例如:把一个运行着gitlab 的容器内存限制在2048M以内
docker update --memory 2048m --memory-swap -1 gitlab

  • m : 指定容器内存

  • --memory-swap : 设置容器交换分区大小,设置交换分区必须要设置 -m:依赖前者

 CPU的限制

  • --cpus= value : 指定 cpu的核心数量,这种方式直接限定了容器可用的cpu资源
  • docker run --name os1 -it -m 1g --cpus=2 centos:latest bash

docker-compose资源限制

docker-compose资源限制&docker资源监控_allen sue的博客-CSDN博客_docker-compose limit

>  v2:pu_shares,cpu_quota,cpuset, mem_limit,memswap_limit,mem_swappines

 version: '2'
  services:
    testservice:
      image: image
      container_name: container_name
      ports:
        - 'ports_out:ports'
      privileged: True
      volumes:
        - /:/rootfs:ro
        - /var/run:/var/run:rw
        - /sys:/sys:ro
        - /var/lib/docker:/var/lib/docker:ro
        - /cgroup:/cgroup:ro
      mem_limit: 512m
      restart: always

  networks:
    default:
      external:
        name: br0
  • start command:docker-compose up -d

 

>v3:deploy

 version: "3"
  services:
    test:
      image: image
      container_name: container_name
      deploy:
        resources:
          limits:
            cpus: '0.50'
            memory: 500M
  
  networks:
    default:
      external:
        name: br0
  • start command:docker-compose --compatibility up -d

 

java微服务的jvm调整


JAVA_OPTS="-server -Xms6g -Xmx6g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:-OmitStackTraceInFastThrow"

java  -Xms1g -Xmx1g  -jar  $4  --spring.profiles.active=pro --server.port=$5 --server.ip=$6 

问题:

docker 容器设置了 –restart always,此时 java 发生了 java.lang.OutOfMemoryError: Java heap space,  容器并没有重启

微服务启动已经设置了 -Xms -Xmx

Docker 容器内 Java 应用发生 OutOfMemoryError 堆内存空间不足时, 容器无法重启应用 - JoyLau's Blog | JoyLau

解释

JVM堆内存超出xmx限制,并抛java.lang.OutOfMemoryError: Java heap space异常。堆内存爆了之后,JVM和java进程会继续运行,并不会crash

解决

当JVM出现 OutOfMemoryError,要让 JVM 自行退出, 这样容器就会触发重启

添加新的 jvm 配置: ExitOnOutOfMemoryError and CrashOnOutOfMemoryError

该配置支持 jdk8u92 版本及其之后的版本 

 ExitOnOutOfMemoryError: 启用此选项时,JVM在第一次出现内存不足错误时退出。如果您希望重新启动JVM实例而不是处理内存不足错误,则可以使用它。
CrashOnOutOfMemoryError: 如果启用此选项,则在发生内存不足错误时,JVM崩溃并生成文本和二进制崩溃文件(如果启用了核心文件)。

JAVA_OPTS = “-XX:+ExitOnOutOfMemoryError”


JAVA_OPTS="-server -Xms6g -Xmx6g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:-OmitStackTraceInFastThrow -XX:+ExitOnOutOfMemoryError"

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值