压测调优之遇到的proxool问题

在200并发压测时,由于Proxool和Oracle的结合导致内存泄露,主要是T4CPreparedStatement和Finalizer对象。问题在于proxool代理类的finalize方法与业务线程竞争数据库连接的isClosed锁,导致内存无法释放。解决方案是替换为Druid数据源,优化后TPS提升,响应时间减少。结论:避免在Oracle环境下使用Proxool。
摘要由CSDN通过智能技术生成

T4CPreparedStatement内存泄露现象

  1. 现象

    • 200并发压测压10分钟左右内存吃满
    • jmap -histo | head 20 发现有大量的Connection对象和T4CPreparedStatement以及部分Finalizer对象,dump下来分析发现Connection和PreparedStatement这些对象都是no gc root
    • 线程dump发现finalizer线程时常blocked在connection.isReallyClosed,而拿着锁的线程在执行数据库读写

      "Finalizer" - Thread t@3
         java.lang.Thread.State: BLOCKED
          at oracle.jdbc.driver.PhysicalConnection.isClosed(PhysicalConnection.java:1508)
          - waiting to lock <785dbebb> (a oracle.jdbc.driver.T4CConnection) owned by "http-bio-80-exec-19" t@70
          at org.logicalcobwebs.proxool.ProxyConnection.isReallyClosed(ProxyConnection.java:206)
          at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:114)
          at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87)
          at oracle.jdbc.internal.OracleConnection$$EnhancerByProxool$$9245683f.finalize(&l
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值