- 记一次一个小的认知刷新
排查oom问题较多,但是形成了一个固有的认知,oom后,整体stw了,中间件就不工作了,或者直接进程死了
情况分解
oom 类型
这个网上文章很多,不赘述。 堆溢出 栈溢出 metaarea溢出等-
oom 数据流
有个注意点,造成我认知错误的有两点
oom 只是对当前线程来说,不影响其他线程(特殊情况是,如果系统除了oom线程外,全部是守护线程,那么oom线程挂了之后,整个程序就exit 了,抛掉被系统kill的情况,是正常退出)
因为常规工作机都是linux,因为服务器上一般都是被linux oomkiller 干掉了oom线程归属的进程,所以引发了一个错误认知,oom后,进程挂了
小测试
- tomcat 上一个测试
@RequestMapping("/oom/thread")
public void oomThread()
{
System.out.println("=========/oom/thread===========");
new Thread(()->{
ArrayList<byte[]> arrayList = new ArrayList<byte[]>();
for(;;)
{
arrayList.add(new byte[1024*1024]);
}
}).start();
System.out.println("=========/oom/thread===end========");
}
结果图:
发现 tomcat依然跑的很健康,而且oom线程,启动一个来一个 很溜 咳咳。。。
-
整体 gc 图:
-
疯狂刷新那个oom action的地方gc
学习的步骤不能停,药不能停 哈哈