当前位置: 首页 > news >正文

JVM感知docker容器内存资源限制

容器中的java程序无法感知docker的内存资源限制
[root@xm-phy-kvm-113-2 ~]# docker run -m 100MB openjdk:8u131 java -XshowSettings:vm -version
VM settings:Max. Heap Size (Estimated): 17.43GErgonomics Machine Class: serverUsing VM: OpenJDK 64-Bit Server VMopenjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

 我设置了 100MB 的容器内存,但JVM 设置了17.3G 的最大堆?它很可能会导致内核在某个时候杀死JVM程序

[root@xm-phy-kvm-113-2 ~]# docker run -m 100MB openjdk:8u131 java   -XX:+UnlockExperimentalVMOptions   -XX:+UseCGroupMemoryLimitForHeap   -XshowSettings:vm -version
VM settings:Max. Heap Size (Estimated): 44.50MErgonomics Machine Class: serverUsing VM: OpenJDK 64-Bit Server VMopenjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
java服务无感知docker资源限制导致的问题

在K8s中Deployments配置资源限制和预留的时候,比如设置最大内存为100M。但是宿主机的总内存为80G,这时候Pod启动后会超出内存限制,被Deployments杀掉。但为了维护设置的副本数量又创建新的,如此反复。

原因是默认情况JVM默认最大堆空间为系统总内存的1/4,在容器中没有感知到集群为Pod设置的资源限制,而是按宿主机的内存算的,所以最终超过限制内存。

解决方案

解决思路有两种:

  • 按资源限制算好,在 Java 启动参数中设置堆内存大小,保证不超限制
  • 让JVM感知到容器资源限制,按这个值来分配内存

Java SE 8u131向后 和 JDK 9 都有参数支持:如下

-XX:+UnlockExperimentalVMOptions 
-XX:+UseCGroupMemoryLimitForHeap

但是如果资源限制默认分配1/4有点浪费,因为一般一个Pod就跑这一个主要进程,所以可以改下这个默认值,如下:

# 2 代表1/2
-XX:MaxRAMFraction=2

这样配置并不代表就是资源限制的1/2,因为除了堆内存还有其他堆外内存需要空间,所以实际值要远小于1/2。网上有人在测试环境设置1,代表100%,但是我试过之后还是超过资源限制了,所以选了2,实际需要根据情况决定。

Java 8u131及以上版本开始支持了Docker的cpu和memory限制。

cpu limit(默认支持)

即如果没有显式指定-XX:ParalllelGCThreads 或者 -XX:CICompilerCount, 那么JVM使用docker的cpu限制。如果docker有指定cpu limit,jvm参数也有指定-XX:ParalllelGCThreads 或者 -XX:CICompilerCount,那么以指定的参数为准。

memory limit

在java8u131+及java9,需要加上-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap才能使得Xmx感知docker的memory limit。

参数/版本-XX:+UseCGroupMemoryLimitForHeap-XX:ActiveProcessorCount-XX:+UseContainerSupport
java9experimental,默认false
java10experimental,默认false-1
java11移除-1product,默认true

参考链接:
链接:
https://segmentfault.com/a/1190000014142950

Java SE support for Docker CPU and memory limits

Running a JVM in a Container Without Getting Killed

让JVM感知K8s资源限制 - 简书

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Blender----利用DEM(tif)生成三维模型
  • 解读红外控制遥控器原理!!!
  • Pytest框架直接右键运行 testcase.py,不执行最外层conftest
  • CACTER直播预告:聚焦EDLP邮件数据防泄露实战重点
  • 基于STM32+手机APP设计的智能停车场系统——程序源码原理图设计原理设计文档演示视频框图等(文末工程资料下载)
  • 数据仓库: 4- 数据质量管理 5- 元数据管理
  • 监控用户登录信息,执行事务码情况
  • websocket的介绍及springBoot集成示例
  • 小区物业维修管理系统/小区居民报修系统
  • html+css+js网页设计 专业:珠宝行业宏观环境分析12个页面
  • AC自动机-2(AhoCorasickDoubleArrayTrie)
  • CMakeLists.txt模板
  • C#:Bitmap类使用方法—第3讲
  • 探索ACPL-302J光耦合器的多功能性
  • 区块链浪潮:Web3时代的数字经济新格局
  • ----------
  • 网络传输文件的问题
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android Studio:GIT提交项目到远程仓库
  • Android框架之Volley
  • CEF与代理
  • Computed property XXX was assigned to but it has no setter
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java精华积累:初学者都应该搞懂的问题
  • Python语法速览与机器学习开发环境搭建
  • spark本地环境的搭建到运行第一个spark程序
  • Twitter赢在开放,三年创造奇迹
  • ucore操作系统实验笔记 - 重新理解中断
  • uni-app项目数字滚动
  • vue-loader 源码解析系列之 selector
  • Vue组件定义
  • Vultr 教程目录
  • 近期前端发展计划
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何设计一个微型分布式架构?
  • 微信支付JSAPI,实测!终极方案
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​水经微图Web1.5.0版即将上线
  • (02)Hive SQL编译成MapReduce任务的过程
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (55)MOS管专题--->(10)MOS管的封装
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)appium-desktop定位元素原理
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .netcore如何运行环境安装到Linux服务器
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .Net小白的大学四年,内含面经
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /var/log/cvslog 太大
  • @Autowired 和 @Resource 区别的补充说明与示例