企业文化

  • 首页
  • 企业文化
  • 如何设置Docker容器中Java应用的内存限制?(做程序开发需要多大的内存,4G还是8G?)

如何设置Docker容器中Java应用的内存限制?(做程序开发需要多大的内存,4G还是8G?)

  • 2024-01-05 06:20:57
  • 67

1.如何在Docker容器中设置Java应用的内存限制?

如果使用官方的Java映像或者基于Java映像的Docker映像,那么通过传递JAVA_OPTS环境变量就可以很容易地设置JVM的内存参数。例如,对于正式的tomcat映像,我们可以执行下面的命令来启动一个最大内存为512M的Tomcat实例。

docker run-RM-e JAVA _ OPTS = '-xmx 512m ' Tomcat:8

在日志中我们可以清楚的发现设置已经生效“命令行参数:-Xmx512m”。

02-Apr-2016 12:46:26.970 INFO[main]org . Apache . catalina . startup . version logger listener . log服务器版本:Apache Tomcat/8.0.32

INFO[main]org . Apache . catalina . startup . version logger listener . log服务器创建时间:2016年2月2日19时34分53秒UTC

02-Apr-2016 12:46:26.975 INFO[main]org . Apache . catalina . startup . version logger listener . log服务器号:8.0.32.0

02-Apr-2016 12:46:26.975 INFO[main]org . Apache . catalina . startup . version logger listener . log操作系统名称:Linux

02-Apr-2016 12:46:26.975 INFO[main]org . Apache . catalina . startup . Version logger listener . log操作系统版本:4.1.19-boot2docker

02-Apr-2016 12:46:26.975 INFO[main]org . Apache . catalina . startup . version logger listener . log架构:amd64

02-Apr-2016 12:46:26.975 INFO[main]org . Apache . catalina . startup . version logger listener . log Java Home:/usr/lib/JVM/Java-7-open JDK-amd64/JRE

02-Apr-2016 12:46:26.976 INFO[main]org . Apache . catalina . startup . Version logger listener . log JVM版本:1.7.0_95-b00

INFO[main]org . Apache . catalina . startup . version logger listener . log JVM供应商:Oracle Corporation

02-Apr-2016 12:46:26.977 INFO[main]org . Apache . CATALINA . startup . version logger listener . log CATALINA _ BASE:/usr/local/Tomcat

02-Apr-2016 12:46:26.977 INFO[main]org . Apache . CATALINA . startup . version logger listener . log CATALINA _ HOME:/usr/local/Tomcat

02-Apr-2016 12:46:26.978 INFO[main]org . Apache . catalina . startup . version logger listener . log命令行参数:-DJ ava . util . logging . config . file =/usr/local/Tomcat/conf/logging . properties

02-Apr-2016 12:46:26.978 INFO[main]org . Apache . catalina . startup . version logger listener . log命令行参数:-DJ ava . util . logging . manager = org . Apache . juli . classloaderlogmanager

02-Apr-2016 12:46:26.978 INFO[main]org . Apache . catalina . startup . version logger listener . log命令行参数:-Xmx512m

...

但是,在Docker集群上部署和运行Java容器应用时,仅仅设置JVM的堆参数是不够的,我们还需要限制Docker容器的内存资源:

1.限制容器使用的最大内存量,以防止损坏系统或其他应用程序。

2.Docker容器可以被调度到一个有足够空闲内存的节点上,从而保证应用程序所需的运行资源。

关于容器的资源分配约束,Docker提供了相应的启动参数。

对于内存,最基本的是通过-m参数限制容器使用的内存大小。

-m,- memory= " "

内存限制(格式:& lt号码[& lt;单位])。Number是正整数。单位可以是b、k、m或g中的一种。最小值为4M。

那么问题来了,为了正确设置Docker容器的内存大小,我们需要同时传递容器和JAVA_OPTS环境变量的内存限制吗?如下所示:

docker run-RM-m 512m-e JAVA _ OPTS = '-xmx 512m ' Tomcat:8

万向

这种方法有两个问题。

1.管理员需要确保容器内存和JVM内存设置匹配,否则可能会导致错误。

2.当调整容器的内存限制时,需要重置环境变量,这需要重新构建一个新的容器。

如何设置Docker容器中Java应用的内存限制?(做程序开发需要多大的内存,4G还是8G?)

有没有办法让容器内部的JVM自动适应容器的内存限制?这样,可以使用更统一的方法来管理资源和简化配置工作。

众所周知,Docker是通过CGroup实现资源约束的。从1.7版本开始,Docker将容器的本地cgroups以只读的方式挂载在容器内部的文件系统上,这样我们就可以通过容器内部的cgroups信息获得当前容器的资源约束。

我创造了一个镜像registry.aliyuncs.com/denverdino/tomcat:8-autoheap.的例子

源代码可以从Github获得。它基于Docker的官方Tomcat镜像,它的启动脚本会检查CGroup中的内存限制,并计算JVM传递给Tomcat的最大堆大小。它的代码如下

#!/bin/bash

limit _ in _ bytes = $(cat/sys/fs/cgroup/memory/memory . limit _ in _ bytes)

# If not cgroup中的默认限制字节数

if[" $ limit _ in _ bytes "-ne " 9223372036854771712 "]

然后

限制兆字节数=$(表达式$限制兆字节数\/ 1048576)

heap _ size = $(expr $ limit _ in _ MB-$ RESERVED _ MB)

导出JAVA _ OPTS = "-Xmx $ { heap _ size } m $ JAVA _ OPTS "

echo JAVA_OPTS=$JAVA_OPTS

船方不负担装货费用

exec catalina.sh运行

描述:

对于监控、故障排除和其他场景,我们保留一些内存(默认为64M),并将容器内存的剩余部分分配给JVM堆。

这里没有进一步处理边界情况。在生产系统中,需要根据情况进行相应的设置,比如最大堆大小等等。

现在让我们启动一个运行在512兆字节容器中的tomcat。

码头运行-d -名称测试-m 512m registry.aliyuncs.com/denverdino/tomcat:8-autoheap

通过下面的命令,我们可以从日志中检测到相应的JVM参数已经被设置为448MB (512-64)。

docker日志测试

...

02-Apr-2016 14:18:09.870 INFO[main]org . Apache . catalina . startup . version logger listener . log命令行参数:-Xmx448m

...

我们还可以方便地调整Java应用程序的内存。

Docker 1.10提供了动态修改容器资源限制的能力。但是,因为JVM不能感知容器资源的修改,所以我们仍然需要重新启动tomcat来更改JVM的内存设置。例如,我们可以通过以下命令将容器内存限制调整为1GB。

docker更新-m 1024m测试

码头工人重启试验

再次检查日志,相应的最大JVM堆大小已经设置为960MB。

docker日志测试

...

02-Apr-2016 14:21:07.644 INFO[main]org . Apache . catalina . startup . version logger listener . log命令行参数:-Xmx960m

2.程序开发需要多大内存,4G还是8G?

内存和硬盘的大小取决于您的系统应用环境。

程序员需要的硬盘比内存少。

首先,一般的高速固态硬盘都是系统盘,128-256G就够了,可以装各种常用的编程软件和各种环境框架程序。如果你经常运行大量的模拟和仿真,你可能需要为固态硬盘使用512G-1T的存储。机械硬盘大量存储编程文件,性价比高。一般1-3T。移动硬盘和u盘会有一定的需求。

你的电脑类型,如果是民用台式机,扩展能力很强。可以从8G入手,最大内存128G也不是不可能。只要预算充足,一般公司都会配备台式机。毕竟是吃饭的家伙,公司不会吝啬的。

笔记本的话,一般会选择全能本/商务本。由于扩展性的严重限制,一般内存容量主要在8-16G左右。如果你的程序经常溢出或者懒得清理内存占用,可以考虑买个32G的版本。硬盘存储足够普通笔记本使用。只要不是缺少固态硬盘的低端机型。

如果你是一个果粉,喜欢在mac os中编码,那么你只需要考虑从不同版本的macbook pro中选择。苹果现在的笔记本都不能升级内存,所以16G版本对很多码农来说都很贵。

对于Linux和Ubuntu的用户来说,windows阵营的笔记本在扩展性上还是很友好的。当他们是新手的时候,8G就够了。随着学习深度的变化和虚拟机的广泛应用,它们可以自己增加一个内存。

随着经验的积累,你会逐渐明白你需要如何配置你的电脑。

#GG


发表评论

提交
万向

万向平台作为一家创新公司,我们坚信用户体验是游戏成功的关键。 我们不断与玩家互动,听取他们的建议和意见,不断改进和优化我们的游戏产品。 通过丰富多彩的活动和社区建设,努力营造开放和谐的游戏环境,让玩家享受游戏带来的乐趣。

网站地图

接洽万向平台