今早收到一条短信,具体报警信息如下:

【UMP JVM监控内存报警】应用名:发券worker(jdos_couponwkr);KEY【coupon.send.worker.jvm】,主机名:【host-10-183-72-114】,实例【11909223645】的堆内存使用率连续3次超过设定阀值【90.0%】。报警级别:【Warning】,报警时间:【2019-07-17 07:36:12】。

说是有一台机器的堆内存使用超过阈值90%。这条短信虽然言简意赅,但是背后隐藏的技术细节,我这里来陈述一下,谬误之处,还请指教。

初看此报警,则知道堆内存使用超过阈值了。第一反应一般都是把堆内内存调大,就行了。但是事实真的如此吗?不妨来一起看看。

假设我们现在堆内内存为1G,则堆内存使用曲线如下:

可以看到整体使用正常,回收正常,非常平稳。

现在,我们把堆内内存调整为2G,则堆内内存使用曲线如下:

可以看到,堆内内存使用率依然超过90%,说明单纯的调节堆内内存的大小,是无法解决此问题的。

为什么呢? 由于jvm工作的时候,对堆内内存的使用是自适应的,你给的多,它用的多,你给的少,它用的少。所以这也是为啥你给它1G大小,它能将堆内存用的超过90%,你给他2G大小,他也能将堆内存用的超过90%。当然,前提是应用的内存使用量大于2G才行。否则分配给2G的堆内存,则不会使用这么高。可能用到1.5G左右就释放了。

再来说说垃圾回收机制。这里我将G1算法之外的统称为老算法。咱们来比较一下:

在8G堆内存的docker上,同一个应用,同一业务,压测结果如下:

1. young gc次数,老算法20次,G1算法8次。

2. 堆内存使用最大值,老算法使用最大6.3G,G1算法使用最大7.6G。

可以看出,在8G堆内存的场景下,G1算法整体表现优异,更少的gc次数,更高效率的堆内存使用率。

但是在8G以下堆内存使用的场景中,G1算法则优势并不明显。所以强烈建议堆内存比较大的应用开启G1算法。

最后说下,遇到此短信提示需要检查的内容。

1. 检查yong gc耗时,平均耗时40ms以内正常,超过1s则需要排查问题。

2. 检查full gc次数,一分钟内数次或者数十次则显得频繁,需要排查。

3. 检查堆内存回收图形,如果内存使用率上去了,但是迟迟下不来,则意味着老年代无法回收,检查代码查明原因,类似图形如下:

可以看到此图中,曲线上去后下不来,原因是应用内部有个本地cache一直在运行且无过期机制导致,后来关闭掉此本地cache则回收正常。

4. 根据jvm使用率曲线的最高点来看当前堆内存大小是否符合设置,如果当前堆内存使用率顶点一直较高,则应用需要的内存比分配的堆内存要大一些,可以在内存资源足够的情况下尝试多分配一些堆内存。

JVM调优之服务内存超过阈值报警的更多相关文章

  1. jvm实战-jvm调优

    jvm调优 jvm调优主要是内存管理方面的调优,包括各个代的大小,GC策略等. 代大小调优 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内 ...

  2. 技能篇:linux服务性能问题排查及jvm调优思路

    只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...

  3. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  4. JVM 调优 内存调优 CPU 使用调优 锁竞争调优 I/O 调优

    Twitter 工程师谈 JVM 调优 2016年03月24日 10:22:30 wenniuwuren https://blog.csdn.net/wenniuwuren/article/detai ...

  5. 堆内存动态分配情况和jvm调优方向

    由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分 ...

  6. java内存管理之垃圾回收及JVM调优

    GC(garbage Collector 垃圾收集器)作用:a.内存的动态分配:b.垃圾回收注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.Jav ...

  7. 【JVM进阶之路】十:JVM调优总结

    1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...

  8. JVM调优基础到进阶

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...

  9. 高并发场景下JVM调优实践之路

    一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...

随机推荐

  1. 利用tp5开发智慧软文发布系统中遇到的一些坑

    1. PHP 计算两个时间戳之间相差的时间 假设你两个时间戳为$a,$b; 你可以用$c=$a-$b;(反正就是大的减小的),这时$c就是两个时间间隔的秒数了. 想求两个时间间隔的天数就用:$c/(6 ...

  2. javascript获取当前时间CurentTime

    function CurentTime(){ var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMo ...

  3. 2019-2020-1 20199304《Linux内核原理与分析》第七周作业

    进程的描述和进程的创建 1.进程描述 1.1操作系统的三大管理功能以及对应的抽象概念: 进程管理 内存管理 文件系统 1.2Linux进程的状态: (1)Linux中进程的状态细分可以分为七种: R运 ...

  4. js4——字符转化

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 在modelarts上部署mask-rcnn模型

    最近老山完成了对mask-rcnn在modelarts上的部署,部署模型来自于这个项目.部署的过程大体和我的上篇文章使用modelarts部署bert命名实体识别模型相似,许多细节也不在赘述.这篇文章 ...

  6. Quantitative proteomics of Uukuniemi virus-host cell interactions reveals GBF1 as proviral host factor for phleboviruses(乌库涅米病毒-宿主细胞互作的定量蛋白质组学揭示了GBF1是个白蛉病毒的前病毒宿主因子)-解读人:谭亦凡

    期刊名:Molecular & Cellular Proteomics 发表时间:(2019年12月) IF:4.828 单位:1德国海德堡大学附属医院2德国汉诺威医科大学3德国亥姆霍茲感染研 ...

  7. Python 报错集合

    1.django_error:HINT: Add or change a related_name argument to the definition for...报错, 详情见: https:// ...

  8. Apache服务——个人用户主页功能

    使用Apache服务部署静态网站(二) 个人用户主页功能 Apache服务程序中有个默认未开启的个人用户主页功能,能够为所有系统内的用户生成个人网站,确实很实用哦~ 第1步:开启个人用户主页功能: [ ...

  9. python pyHook安装

    Hook安装 哇 这东西可真费劲  主要有pyhook和pyhook3 两种 每个都要根据系统版本和python版本 分成各种小版本 具体安装 一.可以在cmd 中输入 pip install pyh ...

  10. HashMap 实现原理解析

    概要 HashMap 最早出现在 JDK 1.2 中,底层基于散列算法实现.HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0.HashMap 并不保证 ...