Docker 中 JVM 内存占用问题

一、问题描述

最近在使用Docker Compose 编排 Spring Boot 应用的时候为了避免应用占用过大内存,为其做了内存限制,结果在应用运行时超过了这个限制,container 被docker killed。

#docker compose编排微服务脚本
version: "2"
services:
  # 指定服务名称
  ibaseEureka:
    image: 192.168.10.156/ibase2.0/eureka-server:2.0.1-SNAPSHOT
    hostname: ibaseEureka
    ports:
      - "8100:8100"
    entrypoint: "java -jar /eureka-server.jar"
    extends:
      file: common.yml
      service: app
    mem_limit: 700M
  ibaseConfig:
    image: 192.168.10.156/ibase2.0/config-server:2.0.1-SNAPSHOT
    hostname: ibaseConfig
    ports:
      - "8101:8101"
    entrypoint: "sh /wait-for.sh ibaseEureka:8100 -t 150 -- java -jar /config-server.jar"
    extends:
      file: common.yml
      service: app
    mem_limit: 700M
  apigateway:
    image: 192.168.10.156/ibase2.0/apigateway:2.0.1-SNAPSHOT
    ports:
      - "8102:8102"
    entrypoint: "sh /wait-for.sh ibaseConfig:8101 -t 150 -- java -jar /apigateway.jar"
    extends:
      file: common.yml
      service: app
    mem_limit: 1024M
  ibaseCas:
    image: 192.168.10.156/ibase2.0/cas:2.0.1-SNAPSHOT
    ports:
      - "8104:8104"
    entrypoint: "sh /wait-for.sh ibaseConfig:8101 -t 150 -- java -jar /cas.war"
    extends:
      file: common.yml
      service: app
    mem_limit: 1024M

二、问题原因

由于制作的镜像未对JVM进行配置,那么 JVM 会默认设置堆栈的大小,这个大小是根据物理机的内存进行分配的。 那么物理机的内存越大,默认分配的最大堆栈就越大(最大堆栈=1/4 * 物理机内存,初始堆栈=1/16 * 物理机内存),而我对Docker容器做了内存限制,JVM 无法感知(不知道自己在Docker容器中运行),就会出现container 被docker killed情况。

三、解决方案

在程序启动时设置最大的堆大小,修改后的编排脚本如下:

#docker compose编排微服务脚本
version: "2"
services:
  ...
  ibaseCas:
    image: 192.168.10.156/ibase2.0/cas:2.0.1-SNAPSHOT
    ports:
      - "8104:8104"
    entrypoint: "sh /wait-for.sh ibaseConfig:8101 -t 150 -- java -Xms300m -Xmx800m   -jar /cas.war"
    extends:
      file: common.yml
      service: app
    mem_limit: 1024M

注意
docker镜像的内存上限,不能全部给“-Xmx”。因为JVM消耗的内存不仅仅是Heap,如下图:

JVM

JVM = Heap + Method Area + Constant Pool + Thread Stack * num of thread
所以Xmx的值要小于镜像上限内存。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容