java 关于 Finalizer 过多导致内存(Res)缓慢上涨

本文分析了由于Finalizer导致的内存Res持续上涨问题,通过使用jmap生成dump文件并借助Eclipse的MAT插件进行分析,发现FileInputStream在高并发场景下未显式关闭,依赖finalize()方法释放资源,而finalize()是单线程执行的,可能导致Finalizer队列堆积。建议在高并发下避免使用嵌套BufferedReader流,直接关闭所有相关流以防止内存异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    病因: 事情的起因是由Flume的项目采集问题引发的. 测试人员发现用top命令查看采集进程的Res一直不断上涨姿势. 所以怀疑是内存泄漏.


一, 对症下药

    首先, 第一步肯定是先瞅瞅代码, 看看有没有那些资源啥的没关闭, 正如读者所想 ---- 没有发现.

二, 通过辅助工具

    最简单查看java内存的方法就是分析dump文件. 

    1>  查找当前进程的Pid , 如图所示, pid 是 50480

    2>  到jdk安装目录bin下面找一个 jmap的命令

    3>  然后 ./jmap -dump:format=b,file=/opt/heap/heap1.bin 50480 , 得到 第一个 heap1.bin

    4>  过个把小时, 再使用这个命令  ./jmap -dump:format=b,file=/opt/heap/heap2.bin 50480 , 得到第二个heap2.bin

    5>  然后就是分析环节了, 我使用的是Eclipse的MAT插件, 具体安装过程百度之

    6>  用Eclipse 分别打开heap文件, 此时请看配图


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值