一、现象回顾
分析结论: 内存已经被处理线程全部占完,FullGC之后基本收不回多少内存,那么意味着很快又会继续FullGC,频繁FullGC占用大量CPU时间片段和暂停会导致系统处理能力剧烈下降,最终导致整个JVM进入崩溃状态
二、问题重现
分析结论: 我们需要避免瞬间流量让服务进入超高负载,进而被击穿
三、解决方案
1.冷启动状态下,没有设置系统保护规则的场景
2.热启动状态下,没有设置系统保护规则:
3.冷启动状态下,设置系统保护规则
如下是压测端视图
4.冷启动性能差之谜
1)HotSpot JVM优化:热点监测JVM会在程序运行期间不断对代码进行不同级别的优化,高频执行代码会被JIT Compiler优化到最佳的状态,而在冷启动开始运行的时候,代码还处于原始状态,性能相对会差
3)崩溃循环:当CPU升高之后,线程切换等操作本身可能会导致CPU更高,从而让系统螺旋式进入一种越来越糟糕的状态,直到达到一个平衡点,而上面的1)和2)随着运行的优化会在达到平衡点之后打破平衡点,螺旋式下降让系统恢复到比较好的状态,但最糟糕的情况是达不到平衡点系统直接崩溃无法恢复
四、题外话
作者:京东零售 吴毓群
内容来源:京东云开发者社区