带你解决java内存爆炸和CPU100%的问题

文章目录

  • java - 内存爆炸、CPU100% 问题分析、定位与解决
    • 背景
    • 堆内存溢出
      • 问题思路整理
    • 堆外内存分析
      • 问题思路整理
    • CPU 100%问题排查
      • 引发原因

java - 内存爆炸、CPU100% 问题分析、定位与解决


背景

  今天给java开发伙伴们分享一个如何对线上项目进行内存和CPU问题分析、定位和解决的方法。相信大多时候我们的工作流程是业务开发,开发完后自己用示例测试,测试好了和前端集成,测试版本发布后如果有测试部门进行一系列的测试,最终给用户部署版本。

  而测试在因为一些测试盲区导致某些方法未经测试进行部署,而在使用中发现有内存占用比例高,或CPU100%的问题。

  而对线上项目问题排查能力是DevOps或者中高级工程师需要掌握的一项技能。


堆内存溢出

问题思路整理

1、堆内存什么情况会溢出 ?
   当资源申请内存时候,申请内存大小超过了剩余可申请大小会抛出OutOfMeMoryError。
2、如何定位申请大量内存的函数?
   当内存溢出抛出异常,程序会终止服务,则不能使用jmap获取,需要进行配置获取内存异常保存快照设置。
3、查找申请内存函数的具体代码类和方法。
   使用工具定位问题代码位置。

  1. 堆内存申请

    配置vm 内存 -Xms256m -Xmx256m
    byte[] buff = new byte[256 * 1204 * 1024];

  2. 定位申请内存的代码位置
      在内存溢出时候,程序会因为抛出异常而终止运行,则需要在抛出异常退出前对内存进行快照保存,以完成代码问题的位置和原因

    内存快照

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\dump2.hprof

    也可以对正在运行jvm程序进行手动快照保存

    #jmap -dump:live,format=b,file=heap.bin

    java工具 visualVM

      对于查看内存快照可以使用 java visualVM 对快照进行加载进行分析
    通过该工具可以查看到内存占用情况
    带你解决java内存爆炸和CPU100%的问题_第1张图片
      很多人都应该对 visualVM 是jvm提供的一个工具,可以对内存快照进行剖析,了解到该快照的内部情况,但这里对于分析内存调用方法显然不太直观。
       接下来给大家推荐MAT工具。

    MAT

    Memory Analyzer Tool

   通过加载内存快照显示对应的快照页面。

你可能感兴趣的:(网易云课堂-微专业Java)