java 内存溢出快速定位

背景:线上数据传输功能开启一段时间后就会出现内存溢出

个人理解:内存溢出,说明要不然获取到大量数据导致内存溢出,要不然就是数据无法释放,随着时间堆积越来越多。
 

日志:查看日志定位是数据传输处的内存溢出导致的,该模块并非使用的定时任务,而是项目启动时运行,while(true)循环推送数据,推送完成后sleep5秒。初步以为是里面的对象未释放,但检查后发现所有对象使用完以后都置为null了。

检查方式:使用jdk的工具jconsole.exe,jvisualvm.exe进行检查

本地程序运行以后,从jconsole里面看到堆内存在缓慢增加,最后达到上限,内存溢出。查看jvisualvm 定位溢出点。

个人理解就是接收端接收速度没有发送端发送的快,导致发送端数据累积发送不过去,越来越多导致数据溢出。查看接收端发现30个线程处理的情况下,5秒钟只能够处理约1000条数据,而发送端是设置的没5秒发送5000条数据。
处理方案:开线程。多套服务接收。修改接收端方法一次接受多条数据(本次不行,限制了一次只能接受一条)

jconsole.exe 和jvisualvm.exe 都在jdk的bin目录下。jconsole.exe打开后直接点击对应的程序,就可以查看了

点击内存可以看到内存的使用情况。
jvisualvm.exe点开后选择对应的程序右侧抽样-内存就可以查看内存的使用情况了

PS : jconsole.exe的内存页面很适合用来学习内存的。堆内存分3个部分,Eden space ,Survivor Space,Tenured Gen。

新建的对象在Eden Space,满了回收,不能回收的到Survivor Space,多次回收都无法回收的到 Tenured Gen

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值