• k8s 的java程序内存设置多大合适 怎么设置


     

    主要参考的三个博客
    参考1:https://www.cnblogs.com/xiaoqi/p/container-jvm.html
    参考2:https://www.imooc.com/article/292785?block_id=tuijian_wz
    参考3:https://blog.csdn.net/qq_40378034/article/details/110677269

    1)采用JDK8-191以上的jdk版本

    由于jdk8-191以前的jdk版本,是不能感知到自己是在容器中运行的,所以对容器设置的资源限制,java程序不能感知,因此会按宿主机的总内存来申请资源

    UseContainerSupport

    -XX:+UseContainerSupport允许JVM 从主机读取cgroup限制,例如可用的CPU和RAM,并进行相应的配置。这样当容器超过内存限制时,会抛出OOM异常,而不是杀死容器。
    该特性在Java 8u191 +,10及更高版本上可用。

    注意,在191版本后,-XX:{Min|Max}RAMFraction 被弃用,引入了-XX:MaxRAMPercentage,其值介于0.0到100.0之间,默认值为25.0。

    2)使用JVM新的资源限制参数且不相等

    java -XX:MaxRAMPercentage=90.0 -XX:MinRAMPercentage=60.0 -jar register.jar
    

    [MAX|MIN]RAMPercentage参数,是191版本后新增加的参数,该参数可以感知容器的资源限制,并以此限制为申请的最大最小资源量,即Xms和Xmx

    由参考文章3中的结论:Xms和Xmx不相等时,在可能的情况下,GC过程会慢慢释放内存回操作系统,而我们 设置的[MAX|MIN]RAMPercentage这两个参数不等,达到的结果就是Xms和Xmx不相等

    # 此命令可以在容器中验证,java服务按此规则申请时,会申请的内存大小
    java -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=90.0 -XX:MinRAMPercentage=60.0 -version | grep -Ei "heapsize|rampercentage"
    

    3)配置容器的资源限制参数

    在前两条的基础上,最后在配合容器的资源限制功能后,就能做到

    1. 限制容器的内存上限
    2. 容器内的jvm服务,能根据资源限制来申请内存
    3. 由于jvm会释放内存,所以可先设一个较大值,经过长期观察,可以确定该服务的常规内存水平
    4. 最终可以实现合理设置了容器、宿主机、java程序三者的内存的目的

    最佳实践

    拉取最新的openjdk:8-jre-alpine作为底包,截止这篇博客,最新的版本是212,>191

    Copy
    docker run -it --rm openjdk:8-jre-alpine java -version
    openjdk version "1.8.0_212"
    OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
    OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
    

    我们构建一个基础镜像,dockerfile如下:

    Copy
    FROM openjdk:8-jre-alpine
    MAINTAINER jadepeng
    
    RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
        && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
        && apk update upgrade \
        && apk add --no-cache procps unzip curl bash tzdata \
        && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone
    
    RUN apk add --update ttf-dejavu && rm -rf /var/cache/apk/*
    

    在应用的启动参数,设置 -XX:+UseContainerSupport,设置-XX:MaxRAMPercentage=75.0,这样为其他进程(debug、监控)留下足够的内存空间,又不会太浪费RAM。

  • 相关阅读:
    LeetCode "Top K Frequent Elements"
    LeetCode "Integer Break"
    HackerRank "Angry Children 2"
    HackerRank "Kitty and Katty"
    HackerRank "Minimum Penalty Path"
    HackerRank "Larry's Array"
    HackerRank "TBS Problem" ~ NPC
    HackerRank "Morgan and a String"
    HackerRank "Favorite sequence"
    Windows不分区VHD装Linux多系统(三):VM虚拟机安装ubuntu18.04
  • 原文地址:https://www.cnblogs.com/gaoyuechen/p/16705626.html
Copyright © 2020-2023  润新知