【内存泄漏案例】

项目场景:

线上有一个项目在跑jmeter并发测试的时候,内存泄漏,然后本地启动测试并发去测试发现也存在内存泄漏的情况。


问题描述

1.使用jmeter 500并发测试的时候,报错
java.lang.OutOfMemoryError: …java heap space…
2.然后设置了内存溢出日志保存路径,使用呢mat打开日志jump文件
打开后如图所示。

在这里插入图片描述

原因分析:

从上图可以分析出这里存在大量的空的对象,是和tomcat相关的配置,然后去nacos上查看配置,有以下的配置。
server.tomcat.max-http-header-size: 10MB
这个配置,会让每个请求都消耗10mb,导致内存溢出,去掉该配置后
内存溢出问题解决,不再有该问题。


解决方案:

慎用server.tomcat.max-http-header-size配置,会导致并发的时候内存溢出,作为一次解决问题的记录分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal是Java中的一个工具类,主要用于保持线程间的数据隔离。然而,不正确地使用ThreadLocal可能导致内存泄漏内存泄漏是指在程序中使用的内存无法被垃圾回收机制回收,导致内存占用不断增加。ThreadLocal的内存泄漏案例如下: 1. 长生命周期的ThreadLocal对象:如果一个ThreadLocal对象的生命周期比应用程序还长,导致ThreadLocal所持有的value对象无法被释放。此时,即使ThreadLocal对象已不再被调用,value对象仍然在ThreadLocalMap中存在,并且无法被垃圾回收,导致内存泄漏。 2. 线程池的ThreadLocal未清理:在使用线程池的环境下,如果某个线程绑定了一个ThreadLocal对象,而未在任务执行结束后手动清除绑定的值,那么该ThreadLocal对象将一直存在于线程池中。如果线程池中的线程数量非常大,将会导致大量ThreadLocal对象未被释放,从而造成内存泄漏。 3. 循环引用:当ThreadLocal对象和其它对象之间存在循环引用关系时,也会导致内存泄漏。因为ThreadLocalMap中的Entry是弱引用,但如果ThreadLocal对象本身被其它对象强引用,就会导致ThreadLocalMap中的Entry无法被清理,从而造成内存泄漏。 为避免ThreadLocal内存泄漏,应注意以下几点: 1. 及时清理ThreadLocal对象:使用完ThreadLocal对象后,应手动调用其remove()方法,确保对应的value对象能够被释放。 2. 避免长生命周期的ThreadLocal对象:尽量将ThreadLocal对象定义为局部变量,而非静态变量或全局变量。 3. 线程池中使用ThreadLocal的安全清理:在使用线程池时,确保在任务执行结束后及时清理线程中绑定的ThreadLocal对象。 4. 避免循环引用:注意ThreadLocal对象与其它对象之间的引用关系,避免产生循环引用。 总而言之,ThreadLocal内存泄漏是由于一些使用不当造成的,合理使用ThreadLocal并进行正确的清理操作,能避免内存泄漏问题的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值