• Docker 容器 jvm 内存参数调整优化


    前言

    在使用Docker部署java 项目时,发现容器占用内存很高,导致服务器内存压力大,一个简单的boot项目,占用达到1G多内存,有些容器甚至达到快3G内存,并且发现java -jar 启动的项目,相比docker容器,内存占用要小很多。

    解决方式

    启动容器,指定jvm 内存参数来降低对服务器内存的消耗

    配置前说明环境

    笔者的环境:是在pom.xml中,生成的dockerFile ,每次MAVEN install都会生成新的dockerFile,并且会执行docker build (通过dockerFile 文件生成docker镜像)所以笔者是在pom文件中,添加jvm参数的

    具体配置

                
                    com.spotify
                    docker-maven-plugin
                    1.0.0
                    
                        ${docker}
                        
                        java
                        
                        yanjun.liu
                        ${project.artifactId}
                        
                            latest
                        
                        
                        /ROOT
                        
                        ["java","-Duser.timezone=GMT+8", "-Xms800m", "-Xmx800m","-XX:MaxPermSize=256m","-XX:MaxNewSize=256m","-jar", "${project.build.finalName}.jar","--spring.profiles.active=${active}"]
                        
                        
                        
                        
                        
                        
                        
                        
                            
                                /ROOT
                                
                                ${project.build.directory}
                                
                                ${project.build.finalName}.jar
                            
                        
                        
                        
                        
                    
                    
                    
                        
                            build-image
                            package
                            
                                build
                                
                            
                        
                    
                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    关键配置,注意 格式,指定的jvm 每项参数,都是独立的,用""包起来
    “-Xms800m”, “-Xmx800m”,“-XX:MaxPermSize=256m”,“-XX:MaxNewSize=256m”

           ["java","-Duser.timezone=GMT+8", "-Xms800m", "-Xmx800m","-XX:MaxPermSize=256m","-XX:MaxNewSize=256m","-jar", "${project.build.finalName}.jar","--spring.profiles.active=${active}"]
    
    • 1

    最后Maven Install 会生成dockerFile文件,最后在执行docker build,看看生成的dockerFile中写了些什么

    FROM java
    MAINTAINER yanjun.liu
    WORKDIR /ROOT
    ADD /ROOT/feynman-aged-web-0.0.1-SNAPSHOT.jar /ROOT/
    ENTRYPOINT ["java","-Duser.timezone=GMT+8","-Xms800m", "-Xmx800m","-jar", "feynman-aged-web-0.0.1-SNAPSHOT.jar","--spring.profiles.active=test"]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    解释一下第三个参数,和第四个
    第三个:上述pom文件中使用了docker-maven-plugin 插件来生成dockerFile,以及build镜像,那么这里的/ROOT 目录就是指的target/docker/ROOT 目录(Maven install 会在此生成一个jar包)

    第四个参数含义:将 target/docker/ROOT/ 目录下的jar包 拷贝 到 docker 容器 内部 根目录 /ROOT/ 下(docker容器内部 / 指的是centos的根目录 /
    毕竟每个docker 容器都是建立在一个小的Linux上的

    第五个就是java JVM 运行时 参数了,当然也可以不用pom插件的方式来生成dockerFIle,dockerFile 直接提前写好,然后shell脚本build运行写好的dockerFile,生成镜像也是一样的

    配置好之后,就可以启动容器了,最终优化效果 节省了最少10个G的内存空间,(docker一共跑了12个java项目)之前32个G满满的,现在还有一半的可使用空间

  • 相关阅读:
    ubuntu 22.04 flameshot 截图异常的问题
    小学生python游戏编程arcade----坦克大战2
    一文搞定 Postman 接口自动化测试
    集合的运算
    Java之并发工具类的详细解析
    一、Vue3基础[内置指令]
    技术为业务赋能:深度剖析开发与业务的紧密结合
    神经网络数据融合特征提取,神经网络 信息融合
    [iOS开发]事件处理与响应者链
    RNN循环神经网络(过程解析)
  • 原文地址:https://blog.csdn.net/m0_67391120/article/details/126327230