云原生环境下JAVA应用容器JVM内存如何配置?—— 筑梦之路

Docker环境下的JVM参数非定值配置 —— 筑梦之路_docker jvm设置-CSDN博客

之前简单地记录过一篇,这里在之前的基础上更加细化一下。

场景说明

使用Java开发且设置的JVM堆空间过小时,程序会出现系统内存不足OOM(Out of Memory)的问题。事件中心的OOM事件是指系统内存不足时,触发了Linux的内存回收(OOM Killer)机制,此时系统会终止内存占用较多的进程以保证系统的正常运行。特别是在容器环境下,不合理的JVM堆参数设置会导致各种异常现象产生,例如应用堆大小还未到达JVM设置的堆阈值或应用的规格限制,就因为OOM导致重启。

一般操作

 

一般操作是设置-Xmx来限制JVM堆大小,但该方式存在以下问题:

  • 当规格大小调整后,需要重新设置堆大小参数。

  • 当参数设置不合理时,会出现应用堆大小未达到阈值但容器OOM被强制关闭的情况。

  • 在容器环境下,Java只能获取服务器的配置,无法感知容器内存限制。

「应用程序出现OOM问题时,会触发Linux内核的OOM Killer机制。该机制能够监控占用过大内存,尤其是瞬间消耗大量内存的进程,然后它会强制关闭某项进程以腾出内存留给系统,避免系统立刻崩溃。」 

最佳实践

 推荐设置的JVM参数如下所示:

-XX:+UseContainerSupport 
-XX:InitialRAMPercentage=75.0 
-XX:MaxRAMPercentage=75.0 
-XX:MinRAMPercentage=75.0 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof
参数说明
-XX:+UseContainerSupport使用容器内存。允许JVM从主机读取cgroup限制,例如可用的CPU和RAM,并进行相应的配置。当容器超过内存限制时,会抛出OOM异常,而不是强制关闭容器。
-XX:InitialRAMPercentage设置JVM使用容器内存的初始百分比。建议与-XX:MaxRAMPercentage保持一致,推荐设置为70.0。
-XX:MaxRAMPercentage设置JVM使用容器内存的最大百分比。由于存在系统组件开销,建议最大不超过75.0,推荐设置为70.0。
-XX:+PrintGCDetails输出GC详细信息。
-XX:+PrintGCDateStamps输出GC时间戳。日期形式,例如2019-12-24T21:53:59.234+0800。
-Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').logGC日志文件路径。需保证Log文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录或收集到SLS,以便自动创建目录以及实现日志的持久化存储。
-XX:+HeapDumpOnOutOfMemoryErrorJVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprofDUMP文件路径。需保证DUMP文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录,以便自动创建目录以及实现日志的持久化存储。

注意事项:

使用-XX:+UseContainerSupport参数需JDK 8u191+、JDK 10及以上版本。JDK 11版本下日志相关的参数-XX:+PrintGCDetails、-XX:+PrintGCDateStamps、-Xloggc:LOG_PATH/gc.log代替。Dragonwell 11暂不支持${POD_IP} 变量。如果您没有将/home/admin/nas容器路径挂载到NAS目录,则必须保证该目录在应用启动前已存在,否则将不会产生日志文件。 

K8S下常见问题

1. 容器出现137退出码的含义是什么?

当容器使用内存超过限制时,会出现容器OOM,导致容器被强制关闭。此时业务应用内存可能并未达到JVM堆大小上限,所以不会产生dump日志。建议您调小JVM堆大小的上限,为容器内其他系统组件预留足够多的内存空间。

 

2. 为什么发生OOM却没有生成dump文件?

当发生OOM Killer时,并不一定会发生JVM OOM,所以不会生成dump文件。您可以采取以下方式来避免这种情况。

  • 如果是Java应用,可以适当调小JVM的堆内存大小。具体配置,请参见本文。

  • 如果是非Java应用,可以调整实例规格,保证充裕的内存资源。

3. 堆大小和规格内存的参数值可以相同吗?

不可以。

因为系统自身组件存在内存开销,所以不能将JVM堆大小设置为和规格内存大小相同的数值,需要为这些系统组件预留足够的内存空间。

4. 在JDK 8版本下设置-XX:MaxRAMPercentage值为整数时报错怎么处理?

这是JDK 8的一个Bug。

具体信息,请参见Java Bug Database。例如,在JDK 8u191版本下,设置-XX:MaxRAMPercentage=70,此时JVM会启动报错。

解决方案如下:
  • 方式一:设置-XX:MaxRAMPercentage为70.0。说明 如果您使用了-XX:InitialRAMPercentage或-XX:MinRAMPercentage,参数值同样不可设置为整数。

  • 方式二:升级JDK版本至JDK 10及以上版本。

5. 为什么JVM参数设置了6 GB,但是内存使用率却很低?

虽然JVM参数已设置-Xms6g -Xmx6g,但是操作系统不会马上分配6 GB的物理内存,需要实际使用后才分配。因此,内存使用率在应用启动的时候,会相对较低,后续会出现攀爬现象。 

堆栈内存调优

 回收器GC调优

吞吐量优先

响应时间优先

用于辅助

 搜集来自:容器JVM内存配置最佳实践

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实验二类编程实验

1.编写一个代表三角形的类(Triangle.java)。 其中,三条边a,b,c(数据类型为double类型)为三角形的属性,该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…

【精】UML及软件管理工具汇总

目录 1 老七工具(规划质量) 1.1 因果图(鱼骨图、石川图) 1.2 控制图 1.3 流程图:也称过程图 1.4 核查表:又称计数表 1.5 直方图 1.6 帕累托图 1.7 散点图&#xf…

通过USM(U盘魔术大师)在PE环境下使用分区助手拷贝磁盘——无损升级硬盘

这里写自定义目录标题 背景本次使用技术步骤1、添加新硬盘2、添加PE3、开机进入BIOS,进入PE4、开始拷贝磁盘5、调整分区5.1 删除系统盘前的所有分区5.2 修改硬盘分区表格式为GUID5.3 新建引导分区 6、修复引导7、大功告成 背景 由于硬盘空间不够的时候就需要更换硬盘…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网: CVPR2024投稿链接: CVPR2024 重要时间节点: CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics: CVPR2024官网: https://cvpr.thecvf.com/Conferences/2024CV…

【设计模式】第7节:创建型模式之“建造者模式”

Builder模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。 在创建对象时,一般可以通过构造函数、set()方法等设置初始化参数,但当参数比较多,或者参数之间有依赖关系,需要进行复杂校验时&a…

Linux进程概念(2)

Linux进程概念(2) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了进程的概念,PCB&am…

【数据结构】树形结构所有路径复原为链表

目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径&…

OpenCV官方教程中文版 —— 图像去噪

OpenCV官方教程中文版 —— 图像去噪 前言一、原理二、OpenCV 中的图像去噪1.cv2.fastNlMeansDenoisingColored()2.cv2.fastNlMeansDenoisingMulti() 前言 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fa…

贝锐向日葵亮相阿里云“云栖大会”:独创专利算法赋能全新云桌面

2023年10月31日-11月2日,一年一度的云栖大会如期举办,国产远程连接服务创领者贝锐受邀参与。活动现场,贝锐CTO张小峰进行了分享,宣布贝锐旗下国民级远程控制品牌“贝锐向日葵”与无影展开合作,同时全新的“云桌面”将于…

后台界面设计都有哪些关键的技巧

在大数据时代,越来越多的设计师接触到背景界面设计。网站的背景是网站数据库和文件的快速操作和管理系统,以便及时更新和调整前台内容。和大多数UI设计一样,背景界面设计也有自己的设计元素和规范。本文将分享和总结背景界面设计的五个关键设…

Lightdb23.4 Client 包含ecpg可执行程序及相关库文件

功能介绍 部分客户在使用Lightdb client绿色包时需要ecpg程序和ecpg相关的头文件和库文件,所以在Lightdb 23.4版本client绿色包中新增了ecpg的程序和相关头文件和库文件,以方便用户的使用。 Client包目录结构 bin目录是可执行程序和脚本,i…

微信聚合聊天系统的便捷功能:自动发圈,跟圈

快到双十一咯,很多商家和自媒体、运营人都在发圈做运营,所以现在发圈的频率也会比以往的多一些,但事情一多就会担心今天的朋友圈忘记发、漏发或者错过发圈的时间导致错过私域里的好友、客户会错过活动时间。 其实这些都是可以不用担心&#…

无需服务器内网穿透Windows下快速搭建个人WEB项目

📑前言 本文主要是windows下内网穿透文章,如果有什么需要改进的地方还请大佬指出⛺️ 参考自:Windows搭建web站点:免费内网穿透发布至公网 🎬作者简介:大家好,我是青衿🥇 ☁️博客首…

day47

今日内容详细 overflow溢出属性 visible 默认值,内容不会被修剪,会呈现在元素框之外 hidden 内容会被修剪,并且其余内容是不可见的 scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余内容 auto 如果内容被修剪&#xff0c…

python之pip常用指令

文章目录 pip show xxx 查看是否安装该 module

再也不用惧怕那些“流氓”软件了!卸载不能卸载软件的方法不少

保持电脑的清洁和整洁至关重要,原因有两个:电脑的健康和幸福,以及你自己。一堆不需要的软件可能会让你的机器陷入困境,变得迟钝,而一个杂乱的桌面也会对你的大脑产生同样的影响。 但清理并不总是那么容易;有时应用程序会留下不需要的痕迹,有时它们会坏掉并拒绝卸载,有…

c++ 实现二叉搜索树

二叉搜索树的概念 二叉搜索树 (BST,Binary Search Tree),也称二叉排序树或二叉查找树。它要么是一颗空树,要么是满足以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为…

消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka&a…

C++引用概述

变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),程序中通过变量来申请并命 名内存空间,通过变量的名字可以使用存储空间。引用是 C中新增加的概念,引用可以看作 一个已定义变量的别名。 引用的语法: Type&…

使用 PyTorch 构建自定义 GPT

一、介绍 介绍大模型,首先考虑一下使用 ChatGPT、Bing Chat 或 Bard 。您是否想过拥有自己的 ChatGPT 会是什么样子?想象一下创建自己的 GPT 模型的兴奋程度。这确实是一种难以置信的感觉! 为了开始构建自定义 GPT 的旅程,让我们仔…