记一次OOM问题排查以及引出的GC优化
一)介绍
我们有一个服务,主要是给一些商家或者供应商查看售卖的票信息,例如报表下载和一些售票的查询等等。
因为平时用的人比较少,而且我们这边可以配置自动扩容的阈值,所以机器配置是 2C8G,两个机房分别 3 台。
项目很少发版本,最近一次的发版本还是前一个月。
我们有一个服务,主要是给一些商家或者供应商查看售卖的票信息,例如报表下载和一些售票的查询等等。
因为平时用的人比较少,而且我们这边可以配置自动扩容的阈值,所以机器配置是 2C8G,两个机房分别 3 台。
项目很少发版本,最近一次的发版本还是前一个月。
虽然有那么点标题党,但是确实让我损失了一杯星巴克,耽误了测试小姐姐的时间~~
事情的起因是这样的,我们有一个接口是对外修改状态用的,例如状态有1,10,20,30,40,50 等等,状态的流转在业务上来说只允许操作一次,不然会导致一些重复的事件触发。
所以为了防止并发修改导致的系统问题,我们在修改数据库的时候,做了一个 CAS 判断
1 | update tbl set status = ? where status = ? and order_id = ? |
JVM 规范中写道:在加载类的时候,分为如下几个大类:
每一步在 JVM 中都规定了具体的几个小节,但是今天本文的重点在于链接阶段,JVM 对一些静态变量做的一些优化,因此对于这里面的每一步具体是做什么的不展开讨论了。
首先「堆」或者「栈」在本质上其实是一个数据结构,简介如下:
「栈」既可以用链表来实现,又可以用数组来实现,用链表来实现的话,它是一个含有头指针和尾指针的一种数据结构,根据含有指针的不同,分为单链表和双向链表。
「堆」是一种类似于「完全二叉树」的数据结构
在 JVM 中由于编译后的 class 文件都是一行行的指令,因此天然适合用「栈」这种数据结构,