当前位置: 首页 > 后端技术 > Java

Openjdk8如何合理使用容器内存资源

时间:2023-04-02 00:47:49 Java

前言Java应用容器化可以更好的解决移植性问题,但是也存在一些不友好的情况,比如低版本的JDK(低于Java8u131)不识别CGroup资源限制。这将导致JVM读取主机的所有CPU和内存。一旦容器使用的资源超过限制,它就会被docker杀死。在kubernetes中,我们会在yaml文件中显示CPU、内存请求和限制的配置。我们希望容器中的JVM进程能够自动识别CGroup资源限制,获取正确的内存和CPU信息,动态调整自己。JVM参数配置以下操作均在4C16G服务器上进行。低于8u131的JVM版本低于8u131的JDK版本不会自动识别CGroup资源限制,需要手动设置初始堆大小和最大堆大小,否则会根据宿主机整个内存设置默认值:配置最大堆大小-Xmx,默认值:内存的1/4配置初始堆大小-Xms,默认值:内存的1/64看不到JVM参数堆大小(估计):3.48G,未能正确识别CGroup资源限制$dockerrun--rm-m2GBopenjdk:8u121-alpinejava-XshowSettings:vm-versionVM设置:最大。堆大小(估计):3.48G人体工程学机器类别:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_121”OpenJDK运行时环境(IcedTea3.3.0)(Alpine8.121.13-r0)OpenJDK64位服务器VM(build25.121-b13,混合模式)配置JVM参数配置-Xmx和-Xms实现我们想要的Result$dockerrun--rm-m2GBopenjdk:8u121-alpinejava-XshowSettings:vm-Xmx2000m-Xms2000m-versionVM设置:最小。堆大小:1.95G最大。堆大小:1.95G人体工程学机器类:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_121”OpenJDK运行时环境(IcedTea3.3.0)(Alpine8.121.13-r0)OpenJDK64位服务器VM(build25.121-b13,混合模式e)8u131及以上版本从8u131版本开始支持UseCGroupMemoryLimitForHeap和MaxRAMFraction这两个选项。CGroupMemory的大小用作JVM堆大小。MAXRAMFraction用于控制实际可用内存量。比如设置为1,就是CGroupMemoryLimit的全部。如果设置为2则为一半,如果为3则为1/3,以此类推|MaxRAMFraction值|堆比|容器内存=1G|容器内存=2G|容器内存=4G|容器内存=8G|容器内存=16G||:——-:|:——-|:——-:|:——-|:——-:|:——-|:——-:|:——-|:——-:|:——-|:——-:|:——|:——:|:——||1|≈90%|910.50M|1.78G|3.56G|7.11G|14.22G|G|3.56G|7.11G||3|≈33%|304.00M|608.00M|1.19G|2.37G|4.74G||4|≈25%|228.00M|455.50M|910.50M|1.78G|3.56G|可以看到未配置的JVM参数堆大小(估计):3.48G,未能正确识别CGroup资源限制$dockerrun--rm-m2GBopenjdk:8u131-alpinejava-XshowSettings:vm-versionVM设置:最大。堆大小(估计):3.48G人体工程学机器类别:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_131”OpenJDK运行时环境(IcedTea3.4.0)(Alpine8.131.11-r2)OpenJDK64位服务器VM(build25.131-b11,混合模式)配置JVM参数配置-XX:+UnlockExperimentalVMOptions,-XX:+UseCGroupMemoryLimitForHeap和-XX:MaxRAMFraction=1可以达到想要的效果$dockerrun--rm-m2GBopenjdk:8u131-alpinejava-XshowSettings:vm-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap-XX:MaxRAMFraction=1-versionVM设置:最大。堆大小(估计):1.78G人体工程学机器类:服务器使用VM:OpenJDK64-BitServerVMopenjdkversion"1.8.0_131"OpenJDKRuntimeEnvironment(IcedTea03.)(Alpine8.131.11-r2)OpenJDK64-BitServerVM(build25.131-b11,mixedmode)8u191及以上从8u191开始在java10+上引入了UseContainerSupport选项,默认开启。不需要同时设置UseCGroupMemoryLimitForHeap已弃用,不建议继续使用。同时可以通过参数-XX:InitialRAMPercentage、-XX:MaxRAMPercentage、-XX:MinRAMPercentage来更精细地控制JVM使用的内存比例。比如一些Java程序在运行时会调用外部进程,申请NativeMemory,所以即使在容器中运行Java程序,也必须为系统预留一些内存。所以-XX:MaxRAMPercentage不能配置太大。没有配置JVM参数。可以看到在不添加任何JVM参数的情况下,也能正确识别出CGroup的资源限制。$dockerrun--rm-m2GBopenjdk:8u191-alpinejava-XshowSettings:vm-versionVM设置:最大。堆大小(估计):455.50M人体工程学机器类别:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_191”OpenJDK运行时环境(IcedTea3.10.0)(Alpine8.191.12-r0)OpenJDK64位服务器VM(build-25.191b12,mixedmode)配置JVM参数使用-XX:MaxRAMFraction参数调整Max.堆大小`console$dockerrun–rm-m2GBopenjdk:8u191-alpinejava-XX:MaxRAMFraction=1-XshowSettings:vm-versionVM设置:最大。堆大小(估计):1.78G人体工程学机器类别:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_191”OpenJDK运行时环境(IcedTea3.10.0)(Alpine8.191.12-r0)OpenJDK64位服务器VM(build25.191-b12,mixedmode)*使用`-XX:InitialRAMPercentage`,`-XX:MaxRAMPercentage`,`-XX:MinRAMPercentage`参数更精细的控制JVM使用的内存比例```console$docker运行--rm-m2GBopenjdk:8u191-alpinejava-XX:InitialRAMPercentage=40.0-XX:MaxRAMPercentage=90.0-XX:MinRAMPercentage=50.0-XshowSettings:vm-version虚拟机设置:最大。堆大小(估计):1.60G人体工程学机器类别:服务器使用VM:OpenJDK64位服务器VMopenjdk版本“1.8.0_191”OpenJDK运行时环境(IcedTea3.10.0)(Alpine8.191.12-r0)OpenJDK64位服务器VM(build25.191-b12,混合模式)参考http://www.51gjie.com/java/55...https://zhuanlan.zhihu.com/p/...https://my.oschina.net/neverf...https://sevenyu.top/2019/04/0...https://qingmu.io/2018/12/17/...本文由猪齿鱼技术原创团队,转载请注明出处:猪齿鱼官网关于猪齿鱼Choerodon的全场景性能平台,提供系统的方法论、协作、测试、DevOps、容器工具,帮助企业打通需求、设计、开发、部署、测试、和服务。操作流程,一站式提升管理效率和质量。从团队协作到DevOps的工具链,从平台工具到系统化方法论,充分满足协同管理和工程效率的需求,贯穿端到端全流程,助力团队绩效更快、更强、更多稳定的。单击此处尝试牙鱼