某次gc频繁

使用jmap -dump得到文件,mat分析,大量Finalizer对象占据了主要空间。Finalizer对象是实现了finalize()方法的f类,生成实例时一对一生成后,挂在Finalizer类的静态队列(一个gcRoot)下的。它可以保证在一次gc后,如果Finalizer对象对应的f类只有Finalizer引用(被静态队列引用,无法销毁),就把该Finalizer对象从static队列移除,并调用f类对象的finalize方法。此后该f类对象就没有引用了,可被gc。
此次Finalizer对象中大多包含的是SocksSocketImpl对象,经查证该类是网络通信常用类,其父类复写了finalizer()方法,执行close()。
用户大量新建局部的SocksSocketImpl对象,导致生成大量Finalizer对象引用了s对象。局部s对象的用户引用被很快释放,但是由于有Finalizer对象引用,在下一次gc时,会把这些Finalizer对象置入queue中等待清理(从F链表中remove),清理后s对象、Finalizer对象才真的没有引用,可以等待回收。用户不及时close()会导致Finalizer对象的清理速度较慢,增加SocksSocketImpl和Finalizer的回收难度。
有经验表明用户及时close()会优化大量Finalizer在链表中堆积的问题。(这里有疑问,用户不close(),是会导致一直持有吗?还是说会导致Finalizer阻塞?因为有经验表明用户及时close()会优化大量Finalizer堆积的问题)待排查。
http://www.infoq.com/cn/articles/jvm-source-code-analysis-finalreference
此次排查似乎不是S对象的原因。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值