前言

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

解决方式

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

配置前说明环境

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

具体配置

            <plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><skipDocker>${docker}</skipDocker><!-- 基础镜像jdk 1.8--><baseImage>java</baseImage><!-- 制作者提供本人信息 --><maintainer>yanjun.liu</maintainer><imageName>${project.artifactId}</imageName><imageTags><imageTag>latest</imageTag></imageTags><!--切换到/ROOT目录 --><workdir>/ROOT</workdir><!--                    <cmd>["java", "-version"]</cmd>--><entryPoint>["java","-Duser.timezone=GMT+8", "-Xms800m", "-Xmx800m","-XX:MaxPermSize=256m","-XX:MaxNewSize=256m","-jar", "${project.build.finalName}.jar","--spring.profiles.active=${active}"]</entryPoint><!--是否推送到docker私有仓库--><!--<pushImage>true</pushImage>--><!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下,这是第二种方式需要配置的--><!--   <dockerDirectory>${project.basedir}</dockerDirectory>--><!--指定远程 docker api地址--><!--<dockerHost>http://127.0.0.1:2375</dockerHost>--><!-- 这里是复制 jar 包到 docker 容器指定目录配置 --><resources><resource><targetPath>/ROOT</targetPath><!--用于指定需要复制的根目录,${project.build.directory}表示target目 录--><directory>${project.build.directory}</directory><!--用于指定需要复制的文件。${project.build.finalName}.jar指的是打包 后的jar包文件。--><include>${project.build.finalName}.jar</include></resource></resources><!-- 以下两行是为了docker push到DockerHub使用的。maven xml中配置harbor的账号密码--><!--<serverId>docker-hub</serverId>--><!--<registryUrl>${docker.repostory}</registryUrl>--></configuration><!--maven package 自动构建镜像到服务器 --><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal><!--<goal>push</goal>--></goals></execution></executions></plugin>

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

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

最后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"]

解释一下第三个参数,和第四个
第三个:上述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满满的,现在还有一半的可使用空间

Docker 容器 jvm 内存参数调整优化相关推荐

  1. 如何给docker容器分配内存和cpu

    如何给docker容器分配内存和cpu?默认情况下,容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面我们 ...

  2. JVM内存参数详解以及配置调优

    基本概念: PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域 ...

  3. jvm内存配置参数_性能测试连载 (23)jvm内存参数设置

    概述 java内存溢出之后,我们需要根据错误信息分析一下内存溢出的具体原因,及时调整中间件的参数. 查看jvm内存分配 linux下可以通过jmap -heap [pid]命令查看jvm的内存分配 例 ...

  4. java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置

    对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建. JVM内存结构 由上图可以清楚的看到 ...

  5. 音频带宽预测与动态参数调整优化报告【音频质量专题】

                                 音频带宽预测与动态参数调整优化报告 目录 音频带宽预测与动态参数调整优化报告 优化背景与目的 优化内容与思路 测试结果汇总 A. 随机丢包网络 ...

  6. docker 容器占用内存_如何限制Docker容器的内存

    容器何时销毁 现在很多服务采用容器化运行,一个容器中运行一个服务,因为容器的创建和启动都是在秒级,所以这种容器化的部署方式被称之为轻量化部署. 1. 容器中服务进程终止 容器的创建和运行是因某个服务进 ...

  7. JVM内存参数设置及常见错误总结

    一.  JVM规范 JVM规范对Java运行时的内存划定了几块区域(详见这里),有:JVM栈(Java Virtual Machine Stacks).堆(Heap).方法区(Method Area) ...

  8. docker 设置 jvm 内存_是否值得付费?Oracle,Open JDK等四大JVM性能全面对比

    市面上可供选择的JVM发行版还是有不少的.选择合适的JVM需要考虑不同的因素.性能是其中一个重要的因素.靠谱的性能研究是很困难的.在本文中,我创建了一个测试,在不同的JVM上执行对比测试.测试程序包括 ...

  9. JDK8 合理设置JVM内存参数

    总述 基本知识 JDK8内存模型 参数 GC基本要点 内存数据收集工具 JVM参数调整过程 一阶段(设置堆区总内存) 二阶段(调整New区内存) 三阶段(调整Eden与Survivor) 总述 生产系 ...

最新文章

  1. SAP打补丁时需要注意的地方
  2. JMP Discovery Summit数据分析峰会登陆中国
  3. LeetCode 26.删除排序数组中的重复项
  4. linux隐藏apache信息,Linux下如何隐藏Apache版本号信息
  5. 英语笔记:写作:Nothing succeeds without a strong will
  6. python定义三维数组不指定长度_插值/调整三维数组大小
  7. 配置csrf_django 入门第一课 配置文件
  8. Linux修改后保存与不保存,强制退出vi与vi下查找命令关键步骤!
  9. [c#] const 与 readonly
  10. HDU 2665 Kth number(主席树静态区间第K大)题解
  11. 清除html宏病毒,表格宏病毒怎么查杀 Excel宏病毒怎么清除?
  12. SQLEXPRESS服务无法启动
  13. 【jzoj1747】马蹄印
  14. Typora 如何自动生成标题序号
  15. 亚马逊注册成功,需要的进一步的设置一:税务信息设置
  16. pybind11学习笔记
  17. BitComet下载做种方法之完全解析- -
  18. 离线条件下dbeaver连接oracle数据库
  19. x3+y3+z3=3
  20. PyCharm激活记录

热门文章

  1. Hive的伴奏_雅沃琪(伴奏) 杨占一 雅沃琪(伴奏)歌曲,雅沃琪(伴奏)mp3在线试听 - 5nd音乐网...
  2. linux下判断文件和目录是否存在[总结]
  3. Postgresql杂谈 23——Postgresql中的全文检索
  4. 如何部署Docker?Docker安装详细教程
  5. 网络 计算机 不见了,教你电脑无线网络连接不见了的解决方法
  6. Cronbach‘a 信度系数分析
  7. 软件设计师之程序设计语言
  8. 机器学习linux系统环境安装
  9. 20210103LinuxProbe
  10. RAC RACChannelTo