JVM调优之服务内存超过阈值报警
今早收到一条短信,具体报警信息如下:
【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调优之服务内存超过阈值报警的更多相关文章
- jvm实战-jvm调优
jvm调优 jvm调优主要是内存管理方面的调优,包括各个代的大小,GC策略等. 代大小调优 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内 ...
- 技能篇:linux服务性能问题排查及jvm调优思路
只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...
- 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)
目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...
- JVM 调优 内存调优 CPU 使用调优 锁竞争调优 I/O 调优
Twitter 工程师谈 JVM 调优 2016年03月24日 10:22:30 wenniuwuren https://blog.csdn.net/wenniuwuren/article/detai ...
- 堆内存动态分配情况和jvm调优方向
由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分 ...
- java内存管理之垃圾回收及JVM调优
GC(garbage Collector 垃圾收集器)作用:a.内存的动态分配:b.垃圾回收注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.Jav ...
- 【JVM进阶之路】十:JVM调优总结
1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...
- JVM调优基础到进阶
GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...
- 高并发场景下JVM调优实践之路
一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...
随机推荐
- day20191113笔记
默写:程序=数据结构+操作系统. 一.文件上传 1.导入commons-fileupload.jar commons-io.jar 2.配置 <bean id="multipartRe ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...
- 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币
原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos ...
- gulp+webpack+angular1的一点小经验(第一部分gulp与webpack的整合)
时间匆匆如流水继上周熟悉了gulp的初步安装与环境配置以后,我的项目又进入了新的阶段! 这篇文章将把我这一周遇到的一些问题,以及解决的方式做一个小小的总结,不一定记的完整,但都是个人的一点经验,分享给 ...
- git的基本使用-1
1.git的安装 这里只介绍在 Linux 上安装. 如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装. 如果以 Fedora 上为例,你可以使用 ...
- Unity3D for iOS初级教程:Part 1/3(下)
转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111735.html 一个手指来统治他们 但是等等,你还没有完全完成! 如果你玩游戏有一 ...
- 【新】Docker实战总结
>>> 目录 <<< Docker简介 Docker优势 Docker基本概念 Docker安装使用 Docker常用命令 Docker镜像构建 Docker本地仓 ...
- 2019牛客全国多校训练四 I题 string (SAM+PAM)
链接:https://ac.nowcoder.com/acm/contest/884/I来源:牛客网 题目描述 We call a,ba,ba,b non-equivalent if and only ...
- LCT(Link Cut Tree)总结
概念.性质简述 首先介绍一下链剖分的概念链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度.目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分. ...
- HDU-3577-------Fast Arrrangement
Chinese always have the railway tickets problem because of its' huge amount of passangers and statio ...