k8s之容器内存与JVM内存

容器内的 Java 应用可能会发生两种类型的 OOM 异常,

JVM 的 OOMJVM 的堆栈元空间等内存泄漏,导致没有足够的内存来为对象分配空间并且GC也没有空间可回收时,这时JVM会主动抛出错误并退出进程,并留下相应的错误记录。容器退出状态为exit code 137 reason: error(137表示容器收到SIGKILL信号而失败,通常是达到资源限制或探针失败

容器 OOM一般是JVM参数设置不合理,导致container_memory_working_set_bytes达到了cgroups限制,会在k8s事件中记录且容器退出状态为exit code 137 reason: OOM Killed

从容器来看

container_memory_working_set_bytes代表容器真实使用的内存量,也是判断超过limit的限制,超过limit则会导致oom;

container_memory_working_set_bytes = container_memory_usage_bytes - total_inactive_file(不活跃缓冲页);

container_memory_usage_bytes = container_memory_rss(进程实际使用的物理内存)+container_memory_cache(页面缓存)+kernel memory;

container_memory_cache = total_active_file + inactive_file;

从jvm来看

进程实际使用的物理内存container_memory_rss = JVM内存(堆栈元空间)+直接内存+其他(文件描述符、GC消耗等等);

容器真实使用的内存量container_memory_working_set_bytes = JVM内存(堆栈元空间)+直接内存+其他(文件描述符、GC消耗等等)+container_memory_cache(页面缓存)+kernel memory;

而预留内存又=直接内存+其他(文件描述符、GC消耗等等)+container_memory_cache(页面缓存)+kernel memory;

综上,容器真实使用的内存为 JVM内存(堆栈元空间)+ 预留内存(直接内存+文件描述符、GC消耗等 + 活跃的缓存页 + kernel memory)

一种解决 JVM 内存超限的方法

可以让 JVM 自动感知 docker 容器的 cgroup 限制,从而动态的调整堆内存大小。JDK8u131 在 JDK9 中有一个很好的特性,即 JVM 能够检测在 Docker 容器中运行时有多少内存可用。为了使 jvm 保留根据容器规范的内存,必须设置标志 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap。

注意:如果将这两个标志与 Xms 和 Xmx 标志一起设置,那么 jvm 的行为将是什么?

-Xmx 标志将覆盖-XX:+ UseCGroupMemoryLimitForHeap 标志。

MaxDirectMemorySize

-XX:MaxDirectMemorySize=size用于设置New I/O(java.nio) direct-buffer allocations的峰值,-XX:MaxDirectMemorySize 没显式配置的时候,NIO direct memory 可申请的空间的上限就是 -Xmx 减去一个 survivor space 的预留大小。如果不配置 -XX:MaxDirectMemorySize 并配置 -Xmx5G,则 默认 MaxDirectMemorySize 也将是 5G-survivor space 区,并且应用程序的总堆+直接内存使用量可能会增长到 5G + 5G = 10 G

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
监控Kubernetes(K8s)容器内部的JVM是一种重要的操作,它能够帮助我们了解JVM的性能和健康状况以及整个容器环境中JVM的运行情况。以下是一些方法和工具来监控K8s容器内部的JVM。 首先,我们可以使用Kubernetes Dashboard或类似的监控工具来查看容器的资源使用情况,例如CPU、内存和存储。这可以帮助我们了解JVM是否正在消耗太多的资源或者是否需要进行资源调整。 其次,我们可以通过日志收集工具,如ELK(Elasticsearch、Logstash和Kibana)堆栈,监控JVM的日志输出。这些工具可以帮助我们实时查看JVM的日志,并进行搜索和过滤。 另外,可以使用性能监控工具,例如Prometheus和Grafana,来监控JVM的性能指标,如内存使用、GC(垃圾回收)时间、线程和类加载情况等。这些工具提供了仪表板和可视化图表,使我们能够直观地了解JVM的运行情况。 还可以使用工具如VisualVM和JMX(Java Management Extensions)来远程监控JVM。这些工具可以通过JMX协议访问JVM的MBean(管理Bean),并提供可视化界面来监控和分析JVM的运行时数据。 最后,我们还可以使用APM(Application Performance Monitoring)工具来监控K8s容器内部的JVM。APM工具可以提供更深入的性能监控和分析,例如方法级别的调用链跟踪、错误和异常的监测等。 综上所述,监控K8s容器内部的JVM可以通过使用Kubernetes Dashboard、ELK堆栈、Prometheus和Grafana、VisualVM、JMX和APM等工具来实现。这可以帮助我们全面了解JVM的性能和健康状况,并及时发现和解决潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值