docker中部署Java服务占用内存过大问题

您所在的位置:网站首页 星火英语官方下载app docker中部署Java服务占用内存过大问题

docker中部署Java服务占用内存过大问题

#docker中部署Java服务占用内存过大问题| 来源: 网络整理| 查看: 265

1. 问题背景

公司内部,使用springboot进行后端接口开发,因为当前后端开发只有自己一人,所以对于一些细节问题,没有进行深入的考虑。

每次开发完一段业务,直接通过 java -jar 命令的方式,把程序放入docker中进行运行。也从来没有考虑过内存问题。偶然间发现内存泄漏问题,导致docker服务直接kill掉。通过命令查看docker服务内存使用情况,发现一个小小的Java服务,内存竟然用到了1G以上,真的是惊呆了。(以内网环境服务进行说明):

a. 通过查看docker服务的内存使用情况命令:docker stats

 通过上图,可以很清晰的看到,两个简单的Java服务,内存竟然干了这么多,我...;

2. 原因分析

a. 因为本人使用docker的时候,并没有对docker的内存使用进行大小设置,所以默认docker容器使用的内存,是宿主机的内存大小;

b. 查阅相关资料,可以知道,Java内存的使用,除了堆内存(Heap)外,还有很多内存使用:

java程序的堆内存,最大就是 -Xmx设置的这个值Garbage collection在垃圾回收的时候使用的内存JIT optimization使用的内存java程序的Off-heap所使用的内存java程序的Metaspace所使用的内存JNI Code所占用的内存jvm启动的时候所占用的内存。  3. 解决方式

a. 在启动容器时,可以使用 -m 参数来对docker容器的内存使用大小进行设置(个人不建议整体上对docker的内存使用进行设置,很不灵活):

docker run -d --name test-spring -m 512m --env LOG_LEVEL=ERROR -e "spring.profiles.active=test" -p 30225:30225test-spring

这样,我们就对docker容器运行时使用的内存大小进行了限制;

下面,我们看一下进行限制后的Java服务内存使用情况:

可以很清晰的看到,红框中的Java服务为限制内存后的服务占用内存情况,形成了鲜明的对比;

b.  补充说明:本人试验当前方案还没有出现什么问题,为了避免后续问题出现,建议在Java启动时,同时指定一下堆内存(Heap)大小,大小一般为容器大小的3/4即可:-Xmx400m

ENTRYPOINT ["java","-jar","-Xmx400m","-Duser.timezone=GMT+08","-Dloader.path=lib","test-spring.jar"]

你的努力,终将成为你最有力的资本!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3