首页 > 后端开发 > 正文

如何减少Docker中的Java内存消耗

2024-03-22 23:50:58 | 我爱编程网

今天我爱编程网小编为大家带来了如何减少Docker中的Java内存消耗,希望能帮助到大家,一起来看看吧!

本文目录一览:

如何减少Docker中的Java内存消耗

如何减少Docker中的Java内存消耗

最近在和阿里的一些同事谈起使用Docker部署Java应用的场景,其中一个大家普遍关心的问题就是如何设置容器中JVM的内存限制。

如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递 JAVA_OPTS 环境变量来轻松地设置JVM的内存参数。比如,对于官方Tomcat 镜像,我们可以执行下面命令来启动一个最大内存为512M的tomcat实例

docker run --rm -e JAVA_OPTS='-Xmx512m' tomcat:8

在日志中,我们可以清楚地发现设置已经生效 “Command line argument: -Xmx512m”

02-Apr-2016 12:46:26.970 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.32

02-Apr-2016 12:46:26.974 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Feb 2 2016 19:34:53 UTC

02-Apr-2016 12:46:26.975 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.0.32.0

02-Apr-2016 12:46:26.975 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux

02-Apr-2016 12:46:26.975 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 4.1.19-boot2docker

02-Apr-2016 12:46:26.975 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64

02-Apr-2016 12:46:26.975 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/lib/jvm/java-7-openjdk-amd64/jre

02-Apr-2016 12:46:26.976 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.7.0_95-b00

02-Apr-2016 12:46:26.976 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation

02-Apr-2016 12:46:26.977 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat

02-Apr-2016 12:46:26.977 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat

02-Apr-2016 12:46:26.978 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties

02-Apr-2016 12:46:26.978 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

02-Apr-2016 12:46:26.978 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx512m

...

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

1. 限制容器使用的内存的最大量,防止对系统或其他应用造成伤害

2. 能够将Docker容器调度到拥有足够空余的内存的节点,从而保证应用的所需运行资源

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

对内存而言,最基本的就是通过 -m参数来约束容器使用内存的大小

-m, --memory=""

Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M.

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

docker run --rm -m 512m -e JAVA_OPTS='-Xmx512m' tomcat:8

这个方法有两个问题

1. 需要管理员保证容器内存和JVM内存设置匹配,否则可能引发错误

2. 当对容器内存限制调整时,环境变量也需要重新设定,这就需要重建一个新的容器

是否有一个方法,可以让容器内部的JVM自动适配容器的内存限制?这样可以采用更加统一的方法来进行资源管理,简化配置工作。

大家知道Docker是通过CGroup来实现资源约束的,自从1.7版本之后,Docker把容器的local cgroups以只读方式挂载到容器内部的文件系统上,这样我们就可以在容器内部,通过cgroups信息来获取系统对当前容器的资源限制了。

我创建了一个示例镜像 registry.aliyuncs.com/denverdino/tomcat:8-autoheap

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

#!/bin/bash

limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)

# If not default limit_in_bytes in cgroup

if [ "$limit_in_bytes" -ne "9223372036854771712" ]

then

limit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)

heap_size=$(expr $limit_in_megabytes - $RESERVED_MEGABYTES)

export JAVA_OPTS="-Xmx${heap_size}m $JAVA_OPTS"

echo JAVA_OPTS=$JAVA_OPTS

fi

exec catalina.sh run

说明:

为了监控,故障排查等场景,我们预留了部分内存(缺省64M),其余容器内存我们都分配给JVM的堆。

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

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

docker run -d --name test -m 512m registry.aliyuncs.com/denverdino/tomcat:8-autoheap

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

docker logs test

...

02-Apr-2016 14:18:09.870 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx448m

...

我们也可以方便的调整Java应用的内存.

Docker 1.10提供了对容器资源限制的动态修改能力。但是由于JVM无法感知容器资源修改,我们依然需要重启tomcat来变更JVM的内存设置,例如,我们可以通过下面命令把容器内存限制调整到1GB

docker update -m 1024m test

docker restart test

再次检查日志,相应的JVM Heap Size最大值已被设置为960MB

docker logs test

...

02-Apr-2016 14:21:07.644 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx960m

...

如何减少Docker中的Java内存消耗

如何使用Docker 进行Java 开发

我爱编程网(https://www.52biancheng.com)小编还为大家带来如何使用Docker 进行Java 开发的相关内容。

在这个例子中需要增加三个文件:

Maven的配置文件: pom.xml

一个Java类:Hello.java

一个Dockerfile

源码是下面的代码:

pom.xml

pom.xml包含一些基本的Maven配置,比如配置Spark所依赖的Java 8。它会把所有的依赖封装成一个大的jar包。

Hello.java我爱编程网

pom.xml文件定义mainClass为sparkexample.Hello,需要在src/main/java/sparkexample/目录下创建Hello.java文件。Dockerfile

最后我们来编写Dockerfile文件,这个Dockerfile使用到了Java镜像(java:oracle-java8),并从安装Maven开始做起。下一步它会安装项目依赖。我们通过pom.xml来解析这些依赖,正如你所看到的,它允许Docker缓存这些依赖。下一步,要编译打包应用,并启动应用。如果重建应用时,pom.xml文件没有任何修改,之前的步骤都被缓存下来了,直接到最后一步启动应用。这可以加快应用的重新构建速度。

创建和运行

一旦这三个文件已经完成,那创建Docker镜像就变得轻而易举了。

$ docker build -t giantswarm/sparkexample .

注意:首次启动时会花费一些时间,因为它要安装Maven并下载所有的依赖。之后再启动就需要几秒钟,因为所有的东西都已经缓存了。

镜像创建之后,用下面的命令创建容器:

docker run -d -p 4567:4567 giantswarm/sparkexample

用下面的命令访问:

curl localhost:4567 hello from sparkjava.com

如何减少Docker中的Java内存消耗

如何使用Docker 进行Java 开发

我爱编程网(https://www.52biancheng.com)小编还为大家带来如何使用Docker 进行Java 开发的相关内容。

现在有非常多的Java Web框架,但这里并不打算使用它们。只想要的是一个小的框架所以可以选择Spark,它是一个基于Java 8的极小的框架。Spark使用Maven作为构建工具。

回到顶部

源代码和配置文件

在这个例子中要增加三个文件:

Maven的配置文件: pom.xml

一个Java类:Hello.java

一个Dockerfile

以上就是我爱编程网整理的如何减少Docker中的Java内存消耗相关内容,想要了解更多信息,敬请查阅我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“如何减少Docker中的Java内存消耗”相关推荐
手机JAVA一般有多少内存?
手机JAVA一般有多少内存?

手机JAVA一般有多少内存?要知道,JAVA运存并非内存,运存的大小,有一部分机型是看不到的,而看的见的JAVA运存的机型一般在JAVA设置里,有一个JAVA大小,一般是好多好多字节,在换算中,1000字节等与1KB,1000KB等于1M,比如23051041字节,就是2.3M的运存,一般天语的手机,都能看见运存的大小,一般是在1.5M左右,诺基亚S40的手机,一般JAVA运存是2M,;诺基

2024-04-06 15:58:24
java如何实现重启docker中运行的java项目
java如何实现重启docker中运行的java项目

java如何实现重启docker中运行的java项目java实现重启docker中运行的java项目步骤如下:1、准备一个简单的javaweb程序,打成jar包之后上传到服务器上。2、创建Dockerfile文件3、生成并启动镜像。4、日志查看,利用java查看实时日志。如何使用Docker进行Java开发1、java项目开发,假定已有一个java项目能够编译成j

2024-04-19 08:19:15
如何使用docker进行java入门级开发
如何使用docker进行java入门级开发

如何使用docker进行java入门级开发现在有非常多的JavaWeb框架,但我这里并不打算使用它们。我只想要的是一个小的框架所以我选择了Spark,它是一个基于Java8的极小的框架。Spark使用Maven作为构建工具。源代码和配置文件在这个例子中你要增加三个文件:Maven的配置文件:pom.xml一个Java类:Hello.java一个Dockerfile如

2024-06-12 05:46:18
怎么修改JaVa的运行内存?
怎么修改JaVa的运行内存?

一个开发java的人需要多大内存?最少是4G。分析:java开发需要安装jdk、eclipse、oracle等软件;java运行需要tomcat、JVM和程序的运行内存;以上的这些软件基本都运行起来的话,大概需要2G多内存,而电脑本身还需要一部分,所以最低配置也得4G,建议开发用6G或者是8G。java对电脑的配置要求是?如果是学习一些基础的编程一般的机器就可以了!

2024-04-05 20:38:48
如何清除JAVA缓存
如何清除JAVA缓存

怎样删除手机java缓存?使用手机自带管理器打开c盘:1:cache文件夹是缓存目录,建议大家定时清空。2:所有temp文件夹是临时目录建议清空。3:依次打开C:/system/dmgr,里面有两个文件夹了,各有一个contents的文件夹,进去之后发现里面的文件是不是似曾相识?嘿嘿,这就是平时上网下载的一些视频啦音乐还有一些文本文件,可以安全删除,不放心的话,这里的文件可以直接打开。4:c

2024-06-22 05:50:20
java内存不足怎么解决?
java内存不足怎么解决?

java内存不足怎么解决?这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个.1.可以在windows更改系统环境变量加上JAVA_OPTS=-Xms64m-Xmx512m2,如果用的tomcat,在windows下,可以在C:\tomcat5.5.9\bin\catalina.bat中加上:setJAVA_OP

2024-04-12 15:50:01
php中两个时间如何相减
php中两个时间如何相减

怎样用php实现两个时间相减,得到相差的天数<?php$time1=mktime(10,20,30,2,5,2000);//2000-2-510:20:30$time2=mktime(18,30,20,5,2,2000);//2000-5-218:30:20$diff=(int)(($time2-$time1)/(24*3600));echo"$time2和$time1

2024-12-18 21:13:51
php如何将 for循环的内容 保存至一个数组?
php如何将 for循环的内容 保存至一个数组?

1、自定义函数:传入一个一维索引数组,要求3个元素换一行,循环输出(用php做求代码,各位大神帮帮忙)function fun1($arr){    for($i=0;$arr<cont($arr);$i++){        echo $arr[$i]." ";        if($i%3==2)        echo "<br />";    }}function 

2024-11-12 22:09:14