本文介绍: 也可以基于线程入手,点开线程的支配树,里面有很多的局部变量,我们得精准的知道,这个线程执行的方法是哪一个。但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。2、如果没有元素,直接放入。
内存调优
内存泄漏和内存溢出
内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。
内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没有特别说明则讨论的都是堆内存泄漏。
少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,就像滚雪球雪球越滚越大,不管有多大的内存迟早会被消耗完,最终导致的结果就是内存溢出。但是产生内存溢出并不是只有内存泄漏这一种原因。
比如初始是这样的。
随着持续泄漏,变成了这样。
常见场景
第一种
第二种
解决内存溢出的方法
Top命令
VisualVM
Arthas
使用阿里arthas tunnel管理所有的需要监控的程序
Prometheus + Grafana
堆内存状况的对比
产生内存泄漏的原因
代码中的内存泄漏
案例1:equals()和hashCode()导致的内存泄漏
案例2:内部类引用外部类
案例3:ThreadLocal的使用
案例4:通过静态字段保存对象
案例5:资源没有正常关闭
并发请求问题
模拟并发请求
使用Jmeter进行并发测试,发现内存溢出问题
诊断
内存快照
MAT内存泄漏检测的原理 – 支配树
导出运行中系统的内存快照并进行分析
分析超大堆的内存快照
案例实战
案例1 – 分页查询文章接口的内存溢出
案例2 – Mybatis导致的内存溢出
案例3 – 导出大文件内存溢出
案例4 – ThreadLocal使用时占用大量内存
案例5 – 文章内容审核接口的内存问题
诊断和解决问题 – 两种方案
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。