• 记一次内存溢出问题的排查、分析过程及解决思路


    谨以此文献给自学路上的兄弟

    起因

    这个测试工具的开发已有一段时间了,由于数据量过大,写入数据较慢,导致工具执行耗时较长,所以再次优化了实现方案,进行二阶段的程序开发。

    经优化后,2000 条数据写入,耗时4秒,个人感觉,快了很多了。

    于是,想批量执行下,看下耗时多长。

    结果10分钟、20分钟、1 个小时过去了...

    程序一直在写入数据,等的我这个蓝瘦呀,寻思去泡杯茶吧。

    结果,接完水回来,尼玛报错了,如下图所示:

    心里过程

    虽然,作为一个测试喵,编码能力与纯开发相比,根本不是一个层次的。

    当然,也可以通过求助开发同事解决,但这并不是退缩、逃避解决问题的理由。

    这个报错,我也是第一次遇到,对于一个不了解内存问题的测试来说,无疑是艰难的,结果各种搜。

    最后,定位到是内存溢出导致的。

    说实话,这个报错卡了我近1.5天,我几次想找同事解决,但我还是忍住了,还是想尝试自己去解决。

    常见的几种内存溢出

    • Java heap space
    • GC overhead limit exceeded
    • PermGen space
    • Metaspace

    尝试过程

    小编经验有限,目前只遇到过第1、2种内存溢出问题。

    下面来分享下,我排查问题的思路及过程。

    网上大多数的博客和文章,写的都是修改运行内存,我都试了一下,根本无效,废弃方案如下:

     

     

    黔驴技穷的我,突然想到之前性能测试,看到过开发通过JDK自带工具jvisualvm,进行GC调优,结果还真的用上了。

    如何操作

    找到JDK安装目录 bin 下的 jvisualvm.exe,双击打开,如下图所示。

    运行你要监控的程序,双击左侧运行程序,工具中会显示程序的运行情况,只保留内存,其他不选,如下图所示。

    内存溢出,所以我们暂时只关注内存就可以了,内存会显示运行时堆内数据的变化,如对象实例等。

    接着是内心等待,查看监控内存情况,结果看到最大内存瞬间增长好几倍,如下图所示。

    最大内存瞬间暴涨好几倍,而且程序同时抛出如下异常。

    问题定位出来了,接下来就是复现查找问题了。

    将运行参数调整-Xmx216m,再次运行程序,同步骤 1、2,点击,堆 dump, 进入监控界面,点击切换至类选项卡如下图所示。

    结果终于被我找到这小子了,原来是它搞的鬼,创建了9314个char数组对象。

    双击这个类名,找到问题如下图所。

    找到问题后,接下来就是优化程序的事了。

    解决方案

    经过以上的排查,找到了问题的原因,是因为写数据时超过允许最大行数导致的溢出,最后采取分段写入,完美解决了这个问题。

    虽然解决了内存溢出问题,但程序的执行依然很慢,后来又找到了大数据的写入数据方法,经过程序的再次优化,260W数据全部写完仅需54秒,真的是 VERY NICE!

    以上就是我排查问题的整个过程,当然这个案例的代码是为了模拟内存溢出写的一段程序,非业务代码,仅供参考的入门案例。

    写在最后

    jvisualvm、 jprofile 真的是一个内存优化、排查问题的一个好工具,可以说是写程序必备神器。

    关于内存溢出问题的文章很多,对我而言,能用上的真的是少之又少,作为一个测试喵并不敢造次和评价,有兴趣的同学可以去买本书去深入学习了解。

    这里要特别感谢强哥的帮助,每次都能给我很多的思路和灵感,让我受益良多。

    强哥

    之前北京同事,多年经验高级JAVA开发工程师

    参考文章

    解决项目中java heap space的问题[1]

    记一次解决OutOfMemoryError: Java heap space详细过程与解决思路[2]

    参考资料

    [1]   解决项目中java heap space的问题: https://blog.csdn.net/smh0310/article/details/90664598

    [2]   记一次解决OutOfMemoryError: Java heap space详细过程与解决思路: https://blog.csdn.net/lyflyyvip/article/details/82288719

  • 相关阅读:
    16、springboot——错误处理原理+定制错误页面(1)
    15、springboot——CRUD-跳转到修改员工页面+员工修改和删除实现 ⑥
    14、springboot——CRUD-跳转到添加员工页面+员工添加实现⑤
    13、springboot——CRUD-thymeleaf公共页面元素抽取④
    12、springboot——CRUD登录和拦截③
    11、springboot——CRUD国际化②
    10、springboot——CRUD导入静态资源以及设置默认访问首页①
    9、springmvc的自动配置
    8、模板引擎thymeleaf(百里香叶)
    7、对静态资源映射的规则
  • 原文地址:https://www.cnblogs.com/longronglang/p/13696250.html
Copyright © 2020-2023  润新知