docker java吃内存,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,如下图:

0e10eeaf7f12

JVM

JVM = Heap + Method Area + Constant Pool + Thread Stack * num of thread

所以Xmx的值要小于镜像上限内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值