首页 > 解决方案 > kubernetes/docker 中的 jvm 内存不足的速度比独立的快

问题描述

我们正在将 JDK 1.8v131 JVM 服务器迁移到 Kubernetes/Docker 环境。
我们很少有 JVM 服务器在独立的 VM 中运行,也很少有运行 Kubernetes/Docker 环境,这两种类型都存在于生产环境中。
在相同的负载下,Kubernetes/Docker JVM 内存不足,而 VM 中的 JVM 运行良好,没有问题。
我们使用完全相同的 JVM 参数在 VM 和容器中运行。

任何想法如何解决这个问题?

以下是选项:

Environment:
      JAVA_MEM_OPTS: -Xms2048M -Xmx2048M 
                     -XX:MaxPermSize=256M -XX:+ExitOnOutOfMemoryError -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 
                     -XX:+HeapDumpOnOutOfMemoryError 
                     -XX:HeapDumpPath=/heapdumps/${HOSTNAME}_$(date +%Y%m%d_%H_%M_%S).hprof  

      JAVA_GC_OPTS:  -Dnogclogging=true -XX:+PrintGC -XX:+PrintGCDetail

2018-12-07T15:43:21.42043862Z {GC 调用前的堆 = 2880(满 625):
2018-12-07T15:43:21.420465613Z PSYoungGen 总计 435712K,使用 249344K
2018-12-04415:412Z:21 空间。 249344K,100% 使用
2018-12-07T15:43:21.420472561Z 从空间 186368K,0% 使用

2018-12-07T15:43:21.420475332Z 到空间 228352K,0% 使用

2018-12-407T15:92ZO Parld.Gen.Gen.15:43:27总计 1398272K,已使用 1397679K
2018-12-07T15:43:21.420480674Z 对象空间 1398272K,已使用 99%
2018-12-07T15:43:21.420483127Z 已
使用元空间 229431K,容量 249792K,已提交 214898,预留 2149
2018-12-07T15:43:21.420485549Z class space used 24598K, capacity 27501K, committed 27544K, reserved 1048576K
2018-12-07T15:43:22.628605014Z 2018-12-07T15:43:21.420+0000: 124733.208: ] ] 1647023K ->1646334K(1833984K), ], 1.2079201 secs] [Times: user=1.98 sys=0.01, real=1.21 secs]
2018-12-07T15:43:22.62868917Z GC 调用后堆=2880 (完整 625):
2018- 12-07T15:43:22.628794768Z psyounggen总435712K,使用了248654K
2018-12-07T15:43:22.62879985z Eden Space 249344K,99%
的空间,99%的空间,二手2018-12-07T:22.62.6284B

: 12-07T15:43:22.628807485Z 到空间 228352K,0% 已使用

2018-12-07T15:43:22.628811115Z ParOldGen 总计 1398272K,已使用 1397679K
2018-12-07T15:43:22.62881498Z对象空间1398272K,99%使用
2018-12-07T15:43:22.6288943Z METASPASPACE
使用229431K,容量229431K,249792K,任务249968K,保留22727278K,
20182.8078K1808K1808K178K1808K178K08K178BESSEVER已用空间 24598K,容量 27501K,已提交 27544K,保留 1048576K
2018-12-07T15:43:22.628831766Z }
2018-12-07T15:43:22.632712004Z {GC 调用前堆 = 2881(完整 6267T15018-120):
2 :43:22.63273803Z PSYoungGen 总计 435712K, 已使用 249344K
2018-12-07T15:43:22.632742051Z 伊甸园空间 249344K, 100% 已使用 **
**2018-12-07T15:43:22.6326874617Z 已使用 2%
2 -12-07T15:43:22.632752151Z 到空间 228352K,0% 已使用

2018-12-07T15:43:22.632756279Z ParOldGen total 1398272K, used 1397679K
2018-12-07T15:43:22.632760269Z object space 1398272K, 99% used
2018-12-07T15:43:22.632764456Z Metaspace
used 229431K, capacity 249792K, committed 249968K, reserved 1271808K
2018-12-07T15:43:22.632768599Z class space used 24598K, capacity 27501K, committed 27544K, reserved 1048576K
2018-12-07T15:43:23.164683101Z 2018-12-07T15:43:22.632+0000: 124734.420:
服务器在此处重新启动

标签: dockerjava-8kubernetesgarbage-collection

解决方案


您是否设置了容器内存资源请求和限制?Jdk 8u131 不知道它在容器内运行。它仍然可以看到主机 VM 资源。这可能就是为什么容器内的 JVM 会立即被杀死。

早在 2017 年就有一篇来自 redhat 的好文章。 https://developers.redhat.com/blog/2017/03/14/java-inside-docker/


推荐阅读