视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

JVM内存溢出分析实战:手把手教你如何分析!

  • 课程笔记
  • 问答交流

JVM之前我分别讲到了:

深入JVM类加载全过程解析

深入JVM内存模型(图文视频详解)

最全JVM垃圾回收算法详解

最全JVM垃圾收集器详解

线上JVM性能优化详解

这节课我准备用一个内存溢出的案例来把以上内容进行一个串联,这样可以更好的把理论与实践完美结合

除此以外,我还会手把手教你通过内存分析工具,如何快速定位问题,如何来快速解决线上问题

好了,废话不多说了,直接进入JVM性能实战环节

评论交流
  1. 李鸿翼

    谈谈内存溢出与内存泄漏的关系?
    内存溢出: 内存使用满了,已经无法再申请内存资源
    内存泄漏: 内存使用后,未释放内存
    内存泄漏会可能导致内存溢出

    谈谈引起内存溢出的原因有哪些?
    1.堆内存空间不足(大量创建对象/死循环)
    2.栈内存空间不足 (递归没有终止条件、大量线程创建)
    3.方法去空间不足 (反射或者动态代理创建对象导致大量类加载)

    如果是你如何来解决?以及后续如何来避免?
    1.如果确实是堆空间不够,增大jvm 内存
    如果是内存有溢出,解决对应的bug
    如果存在大峰值情况下,导致大量对象创建,做限流。

    2. 如果确实stack空间过小, 调整-xss
    避免递归没有终止条件,避免大量线程创建

    3. 如果确实metaSpace过小,调整大小
    对于第三方框架中导致大量类加载的地方,做下评估是否可能导致产生内存溢出。

  2. 路正银

    谈谈内存溢出与内存泄漏的关系?
    内存泄漏是申请了内存用完了不释放,内存溢出是申请内存时,没有足够的内存可以使用。
    内存泄漏最终会导致内存溢出,也可以说内存泄漏是内存溢出的一种。

    谈谈引起内存溢出的原因有哪些?
    1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据
    2、集合类中有对对象的引用,使用完未清空,使得JVM不能回收
    3、代码中存在死循环或循环产生过多重复的对象实体
    4、使用的第三方软件中的BUG
    5、启动参数内存值设置的过小

    如果是你如何来解决?以及后续如何来避免?
    如何解决:
    第一步,修改JVM启动参数,直接增加内存
    第二步,检查错误日志,查看“OutOfMemory”错误前是否有其他异常或错误
    第三步,对代码进行走查和分析,找出可能发生内存溢出的位置
    重点检查以下几点:
    1、检查代码中是否有死循环或递归调用
    2、检查是否有循环重复产生新对象实体
    3、检查对数据库查询中,是否有一次获得全部数据的查询
    4、检查List、Map等集合对象是否有使用完,未清除的问题
    第四步,使用内存查看工具动态查看内存使用情况
    内存溢出绝大部分时候都是源码层面的问题,在开发过程中需要注意的点有:
    1 、尽早释放无用对象的引用
    2 、程序里不可避免大量使用字符串时,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域
    3 、尽量少用静态变量,因为静态变量是全局的,GC不会回收的
    4 、避免集中创建对象尤其是大对象,JVM 会突然需要大量内存,这时必然会触发GC优化系统内存环境;如显式的声明数组空间,而且申请数量还极大
    5 、尽量运用对象池技术以提高系统性能
    6 、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象
    7 、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成Out Of Memory Error的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。