关于java k8s容器环境中的jvm配置与优化

这篇具有很好参考价值的文章主要介绍了关于java k8s容器环境中的jvm配置与优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

环境

版本

备注

k8s

v1.22+

配置cpu/mem limit、健康/就绪检查

openjdk

8

openjdk version "1.8.0_342"

k8s容器化(docker)环境更好的解决了 java app 运行环境的封装问题。但存在着一些限制,比如 Java 并不能发现 pod 设置的内存限制(mem limit,java 默认以宿主机的内存为基准),当 java 内存占用超出 pod mem limit限制时,很容易导致OOM,导致pod重启(健康检查不通过),使服务无法正常对外提供服务等。可以通过以下方式查看:

# 异常查看方法

# 可以查看系统日志
dmesg -T |grep "Out of memory"

# 查看pod状态
kubectl get pod

# 查看pod事件
kubectl describe pod pod-name

OOM说明:

操作系统有一个内核job称为 “Out of memory killer (OOM 终结者)”,当在可用内存极低的情况下会杀死某些进程。只要达到触发条件就会激活,选中某个进程并杀掉。 通常采用启发式算法,对所有进程计算评分 (heuristics scoring),得分最低的进程将被 kill 掉(怎么计算的我也不是很懂~)。 因此 OOM 是系统内核内置的安全保护措施,当可用内存不足, 可能会影响系统稳定,就会设法找出进程并kill。

2. 问题

Docker 容器本质是是宿主机上的一个进程,容器中的查看内存、cpu 与宿主机一致(cat /proc/meminfo,/proc/cpuinfo或使用命令top查看),而 Java 是通过 /proc/meminfo 来获取到内存信息。默认情况下,JVM 的 Max Heap Size 是系统内存的 1/4。

因此,通过设置pod 的 limit 资源限制,可能会导致容器分配的内存小于 JVM 的内存,从而 JVM 进程会被杀死引发OOM。

3. 解决方案

jdk 1.8 堆内存逻辑上分为三部分:新生区+养老区+元空间

这里提供的方法解决 JVM 内存与容器内存配置不一致的问题(还有一种是设置MaxRAMPercentage参数,这里不作讨论),通过在启动参数中设置 JVM xmx xms等参数调整jvm内存大小等,实现 JVM 内存与容器内存配置一致,参数参考如下

ENTRYPOINT ["java", "-Xms512m","-Xmx512m","-Xmn256m","-XX:MetaspaceSize=256m","-XX:MaxMetaspaceSize=256m","-XX:+UseG1GC","-jar","app.jar"]

参数说明:

参数

说明

备注

-Xms

设定程序启动时占用内存

建议与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存

-Xmx

设定程序运行期间最大可占用的内存

建议为实例内存的3/5

-Xmn

设置年轻代大小

对响应有要求的应用,此值可以尽可能的设大

-XX:MetaspaceSize

设置元空间大小

元空间和gc回收有关,值太小会触发fullGC的异常,参考值256m / 512m

-XX:MaxMetaspaceSize

设置元空间最大大小

默认无限制,不配置的话元空间占用的内存会一直增长

-XX:+UseG1GC

开启G1垃圾收集器

回收垃圾,释放资源

-XX:+HeapDumpOnOutOfMemoryError

设置内存溢出时导出堆中相关信息

根据需要配置

-XX:HeapDumpPath=./logs/heap

设置导出堆信息日志路径

示例所占内存配置为

pod分配内存

jvm内存

备注

>=1G

512m+256m+256m

jvm=heap+metaspace+other

注意事项:

metaspacesize要设置最大空间大小,否则空间占用无限大(java8版本之后)

jvm k8s,k8s,云相关,java,jvm,kubernetes

4. 总结及参考配置

分配内存   堆配置推荐

1.5G          -Xmx1G -Xms1G -Xmn256M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M

3G              -Xmx2G -Xms2G -Xmn750M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M

7G              -Xmx6G -Xms6G -Xmn750M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M

以上是关于jvm优化的心得,实际的配置,可结合jvm监控Actuator/ JMX Exporter等方式进行观测统计后配置。个人小解,仅作参考~

觉得有用点个关注/收藏吧~

 文章来源地址https://www.toymoban.com/news/detail-559928.html

到了这里,关于关于java k8s容器环境中的jvm配置与优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s环境部署配置

    目录 一.虚拟机准备 二.基础环境配置(各个节点都做) 1.IP和hosts解析 2.防火墙和selinux 3.安装基本软件 4.配置时间同步 5.禁用swap分区 6.修改内核参数并重载 7.配置ipvs 三.docker环境(各个节点都做) 1.配置软件源并安装docker-ce 2.配置docker加速 四.cri环境配置(各个节点都做)

    2024年02月10日
    浏览(30)
  • IDEA远程调试k8s容器里面的Java应用

    要远程调试运行在 Kubernetes 容器中的 Java 应用,可以使用以下步骤: step1 : 在部署容器的 Kubernetes YAML 文件中,为容器添加远程调试的 JVM 参数,如: step2 : 在容器内运行的 Java 应用启动时,会自动开启一个监听 5005 端口的调试服务,可以使用远程调试工具(如 IntelliJ IDEA、

    2024年02月06日
    浏览(75)
  • k8s源码阅读环境配置

      k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理,同时提升我们Go编程能力。   IDE使用Goland,代码阅读环境需要进行如下配置: 从github上下载代码:https://github.com/kubernetes/kubernetes 在GOPATH目录下新建文件夹:$GOPATH/src/k8s.io/kubernetes 将下载的zip包解压后,将kub

    2024年01月21日
    浏览(31)
  • Devops系列四(使用argocd部署java应用到k8s容器)

    上文已为我们准备好了以下内容: 制作java应用的docker镜像,并推送至镜像仓库 上传helm yaml代码至gitlab仓库(此gitlab和java应用所在的gitlab可以独立,也可以在一起,但是不宜在同一个工程,所以这里特此区分) 安装k8s和argocd argocd的权限设计和对接ldap(非必须) 本文先梳理出整

    2024年02月13日
    浏览(26)
  • 【K8S专题】一、集群环境规划配置

      Kubernetes(k8s)是一个开源的容器编排平台,它可以协调和管理容器化应用程序的生命周期。 Kubernetes集群具有以下优势: 高可用性:Kubernetes提供了多种机制来保证应用程序的高可用性,包括自动化的容器重启和故障转移机制。 可扩展性:Kubernetes可以自动扩展应用程序的

    2023年04月24日
    浏览(25)
  • 关于k8s中的node_exporter异常write: broken pipe问题排查

    公司网络更改重启服务器后,发现Prometheus监控中node节点三个挂掉了,实际上节点服务器是正常的,但是监控的node_exporter请求http://IP:9100/metrics超过10秒没有获取返回数据则认为服务挂掉。 到各个节点服务器用curl命令检测多久返回数据 time_connect :连接时间,从开始到TCP三次握

    2024年02月10日
    浏览(35)
  • K8s: 关于Kubernetes中的Pod的生命周期(状态)以及生命周期的钩子函数处理

    pod 的生命周期 1 ) pod 几种常用状态 1.1 )Pending(挂起) Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行 此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 1.2 )Running(运行中) Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建 至少有

    2024年04月22日
    浏览(45)
  • K8s环境下监控告警平台搭建及配置

    Promethues是可以单机搭建的,参考 prometheus入门 [1] 本文是就Promethues+Grafana在K8s环境下的搭建及配置 启动minikube minikube start 安装helm 使用Helm Chart 安装 Prometheus Operator: helm install prometheus-operator stable/prometheus-operator -n monitoring 报错: 根据 Kubernetes和微服务监控体系 [2] (搜索\\\"降低我们

    2024年02月13日
    浏览(33)
  • k8s搭建(一、环境配置与docker安装)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 k8s搭建文章: k8s搭建(一、k8s环境配置与docker安装) k8s搭建(二、k8s组件安装) k8s搭

    2024年02月21日
    浏览(33)
  • 开源项目ChatGPT-Next-Web的容器化部署(四)-- k8s容器部署使用configmap配置

    本文的内容是在k8s容器中,如何使用configmap对.env文件进行挂载,实现环境的差异化配置。 项目ChatGPT-Next-Web使用了.env文件来配置不同环境下的值: 所以,我们同理新增两个配置文件,见下: 生产环境的.env文件对应生产环境的数据库连接等信息,不可能写在上面的源码中。

    2024年04月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包