java OOM 小计

  • 记一次一个小的认知刷新
    排查oom问题较多,但是形成了一个固有的认知,oom后,整体stw了,中间件就不工作了,或者直接进程死了

情况分解

  • oom 类型
    这个网上文章很多,不赘述。 堆溢出 栈溢出 metaarea溢出等

  • oom 数据流


    image.png

有个注意点,造成我认知错误的有两点

  1. oom 只是对当前线程来说,不影响其他线程(特殊情况是,如果系统除了oom线程外,全部是守护线程,那么oom线程挂了之后,整个程序就exit 了,抛掉被系统kill的情况,是正常退出)

  2. 因为常规工作机都是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========");
    }

结果图:


image.png

发现 tomcat依然跑的很健康,而且oom线程,启动一个来一个 很溜 咳咳。。。

  • 整体 gc 图:


    image.png
  • 疯狂刷新那个oom action的地方gc


    image.png

学习的步骤不能停,药不能停 哈哈

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容