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

【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. Vue之组件及组件通信

    组件之全局组件 //注意:需要在Vue实例化之前注册全局组件,使用Vue.component("组件名",{ template:`组件模板` }) Vue.component(&q ...

  2. mysql配置允许外界连接

    1.在mysql的安装目录下找到mysql.ini 找到bind-address=127.0.0.1 ,(有的有,有的没有) 改为 bind-address = 0.0.0.0 2.登录mysql客户 ...

  3. 【RN - 基础】之React Native组件的生命周期

    下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...

  4. scrapy请求传参-BOSS反爬

    scrapy请求传参-BOSS反爬 思路总结 首先boss加了反爬 是cookies的 爬取的内容为职位和职位描述 # -*- coding: utf-8 -*- import scrapy from ...

  5. 高性能Web动画和渲染原理系列(1)——CSS动画和JS动画

    [摘要] 介绍CSS动画和JS动画的基本特点,以及轻量级动画库velocity.js的基本用法. 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园 ...

  6. 安装破解版IntelliJ IDEA

    1.下载IntelliJ IDEA http://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.注册码破解 http: ...

  7. python BeautifulSoup4 获取 script 节点问题

    在爬取12306站点名时发现,BeautifulSoup检索不到station_version的节点 因为script标签在</html>之外,如果用‘lxml’解析器会忽略这一部分,而使 ...

  8. 简单高效的端口扫描python脚本

    欢迎python爱好者加入:学习交流群 667279387 最近为了获取虚拟机端口开放情况,写了一个简单脚本来查看.共享给大家.下面的代码在python2种测试通过 说明:concurrent是pyt ...

  9. LCT(Link Cut Tree)总结

    概念.性质简述 首先介绍一下链剖分的概念链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度.目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分. ...

  10. 初次在Vue项目使用TypeScript,需要做什么

    前言 总所周知,Vue新版本3.0 使用 TypeScript 开发,让本来就很火的 TypeScript 受到更多人的关注.虽然 TypeScript 在近几年才火,但其实它诞生于2012年10月, ...