Docker 容器 jvm 内存参数调整优化
前言
在使用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 内存参数调整优化相关推荐
- 如何给docker容器分配内存和cpu
如何给docker容器分配内存和cpu?默认情况下,容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面我们 ...
- JVM内存参数详解以及配置调优
基本概念: PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域 ...
- jvm内存配置参数_性能测试连载 (23)jvm内存参数设置
概述 java内存溢出之后,我们需要根据错误信息分析一下内存溢出的具体原因,及时调整中间件的参数. 查看jvm内存分配 linux下可以通过jmap -heap [pid]命令查看jvm的内存分配 例 ...
- java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置
对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建. JVM内存结构 由上图可以清楚的看到 ...
- 音频带宽预测与动态参数调整优化报告【音频质量专题】
音频带宽预测与动态参数调整优化报告 目录 音频带宽预测与动态参数调整优化报告 优化背景与目的 优化内容与思路 测试结果汇总 A. 随机丢包网络 ...
- docker 容器占用内存_如何限制Docker容器的内存
容器何时销毁 现在很多服务采用容器化运行,一个容器中运行一个服务,因为容器的创建和启动都是在秒级,所以这种容器化的部署方式被称之为轻量化部署. 1. 容器中服务进程终止 容器的创建和运行是因某个服务进 ...
- JVM内存参数设置及常见错误总结
一. JVM规范 JVM规范对Java运行时的内存划定了几块区域(详见这里),有:JVM栈(Java Virtual Machine Stacks).堆(Heap).方法区(Method Area) ...
- docker 设置 jvm 内存_是否值得付费?Oracle,Open JDK等四大JVM性能全面对比
市面上可供选择的JVM发行版还是有不少的.选择合适的JVM需要考虑不同的因素.性能是其中一个重要的因素.靠谱的性能研究是很困难的.在本文中,我创建了一个测试,在不同的JVM上执行对比测试.测试程序包括 ...
- JDK8 合理设置JVM内存参数
总述 基本知识 JDK8内存模型 参数 GC基本要点 内存数据收集工具 JVM参数调整过程 一阶段(设置堆区总内存) 二阶段(调整New区内存) 三阶段(调整Eden与Survivor) 总述 生产系 ...
最新文章
- SAP打补丁时需要注意的地方
- JMP Discovery Summit数据分析峰会登陆中国
- LeetCode 26.删除排序数组中的重复项
- linux隐藏apache信息,Linux下如何隐藏Apache版本号信息
- 英语笔记:写作:Nothing succeeds without a strong will
- python定义三维数组不指定长度_插值/调整三维数组大小
- 配置csrf_django 入门第一课 配置文件
- Linux修改后保存与不保存,强制退出vi与vi下查找命令关键步骤!
- [c#] const 与 readonly
- HDU 2665 Kth number(主席树静态区间第K大)题解
- 清除html宏病毒,表格宏病毒怎么查杀 Excel宏病毒怎么清除?
- SQLEXPRESS服务无法启动
- 【jzoj1747】马蹄印
- Typora 如何自动生成标题序号
- 亚马逊注册成功,需要的进一步的设置一:税务信息设置
- pybind11学习笔记
- BitComet下载做种方法之完全解析- -
- 离线条件下dbeaver连接oracle数据库
- x3+y3+z3=3
- PyCharm激活记录
热门文章
- Hive的伴奏_雅沃琪(伴奏) 杨占一 雅沃琪(伴奏)歌曲,雅沃琪(伴奏)mp3在线试听 - 5nd音乐网...
- linux下判断文件和目录是否存在[总结]
- Postgresql杂谈 23——Postgresql中的全文检索
- 如何部署Docker?Docker安装详细教程
- 网络 计算机 不见了,教你电脑无线网络连接不见了的解决方法
- Cronbach‘a 信度系数分析
- 软件设计师之程序设计语言
- 机器学习linux系统环境安装
- 20210103LinuxProbe
- RAC RACChannelTo