当前位置: 首页 > 知识库问答 >
问题:

Kubernetes/Docker中的jvm比独立的jvm更快地耗尽内存

隆长卿
2023-03-14

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

有什么办法解决这个问题吗?

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

共有1个答案

长孙高远
2023-03-14

是否设置了容器内存资源请求和限制?JDK8U131不知道它正在容器内运行。它仍然会看到主机VMs资源。这可能就是为什么容器中的JVM会立即被杀死的原因。

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

 类似资料:
  • 我在Kubernetes集群上运行了一个openjdk:8映像。我添加了内存HPA(水平Pod自动缩放),它可以很好地扩展,但由于JVM不会将内存从堆释放回操作系统,所以Pod不会缩小。以下是hpa。亚马尔 解决这个问题的一种方法是使用正确的GC并使其释放内存,但由于JVM被设计为不经常从堆中释放内存,因此这样做不是一个好主意。库伯内特斯有没有办法解决这个问题?就像不检查操作系统的内存使用情况一样

  • 问题内容: 最近,我一直在对我公司的数据库产品的写入性能进行一些基准测试,并且发现仅切换到64位JVM可以使性能持续提高20-30%。 我不允许详细介绍我们的产品,但基本上它是面向列的数据库,已针对存储日志进行了优化。基准测试包括向其提供几GB的原始日志,并确定分析它们并将其作为结构化数据存储在DB中所需的时间。CPU和I / O的处理非常繁重,尽管很难说是什么比例。 有关设置的一些注意事项: 两

  • 关于Java应用程序使用的驻留内存,我有两个问题。 一些背景细节: 我用-xms2560m-xmx2560m设置了一个java应用程序。 java应用程序在容器中运行。k8s允许容器最多消耗4GB. 堆:应用程序的工作方式似乎是使用所有内存,然后释放,然后使用等等。 这张快照说明了这一点。Y列是空闲堆内存。(由应用程序通过)提取) 我还可以使用HotSpotDiagnosticMXBean来确认它

  • 我们已经封装了一个JVM(Scala)应用程序Java1.7,并试图决定如何分配内存。我们在docker容器中运行了一个应用程序。如果为docker容器分配了4GB的RAM,那么我们是否应该为JVM分配4GB(或者为了安全起见稍微少一点)? 据我所知,除了从入口点调用的进程之外,docker容器中没有其他进程在运行,所以我们不需要担心非JVM内存的使用--这是真的吗,还是过于简化了?我们还有其他问

  • 问题内容: 是否可以在JVM中启动和关闭多个H2数据库? 我的目标是通过为每个用户/帐户分配自己的数据库来支持多租户。每个帐户的数据很少。帐户之间的数据永远不会一起访问,比较或分组;每个帐户都是完全独立的。每个帐户每天只能短暂访问一次,一个月只能访问几次。因此,将数据存储在单个数据库中几乎没有什么弊端,但也存在一些严重的弊端。 所以我的想法是,当用户登录特定帐户时,该帐户的数据库已加载。当该用户注