记一次OOM问题排查以及引出的GC优化

一)介绍

我们有一个服务,主要是给一些商家或者供应商查看售卖的票信息,例如报表下载和一些售票的查询等等。

因为平时用的人比较少,而且我们这边可以配置自动扩容的阈值,所以机器配置是 2C8G,两个机房分别 3 台。

项目很少发版本,最近一次的发版本还是前一个月。

二)问题出现

阅读更多

我就用了一个 assert,竟然让我损失了一杯星巴克

虽然有那么点标题党,但是确实让我损失了一杯星巴克,耽误了测试小姐姐的时间~~

简介

事情的起因是这样的,我们有一个接口是对外修改状态用的,例如状态有1,10,20,30,40,50 等等,状态的流转在业务上来说只允许操作一次,不然会导致一些重复的事件触发。

所以为了防止并发修改导致的系统问题,我们在修改数据库的时候,做了一个 CAS 判断

1
2
update tbl set status = ? where status = ? and order_id = ? 

阅读更多

类的初始化以及静态变量优化

前言

JVM 规范中写道:在加载类的时候,分为如下几个大类:

  • Creation and Loading
  • Linking
  • Initialization

每一步在 JVM 中都规定了具体的几个小节,但是今天本文的重点在于链接阶段,JVM 对一些静态变量做的一些优化,因此对于这里面的每一步具体是做什么的不展开讨论了。

类的初始化

阅读更多

快速写一个程序将JVM的堆或者栈打满

堆和栈

数据结构

首先「堆」或者「栈」在本质上其实是一个数据结构,简介如下:
「栈」既可以用链表来实现,又可以用数组来实现,用链表来实现的话,它是一个含有头指针和尾指针的一种数据结构,根据含有指针的不同,分为单链表和双向链表。
「堆」是一种类似于「完全二叉树」的数据结构

JVM中的堆和栈

在 JVM 中由于编译后的 class 文件都是一行行的指令,因此天然适合用「栈」这种数据结构,

阅读更多