一次线上java 应用响应时间过长问题的排查看了一下应用中的代码,发现每次使用 oss 时都会 new OssClient,用完之后没有 shutdown。br> 但是,new 是在方法内部的,方法内的局部变量按道理说,方法结束后直接就可以回收的啊,这不科,肯定是 ossClient 的源码中搞了鬼。于是直接去源码中看了一下。
发现在 new OssClient 时,源码中会新建上面提到的 PoolHttpConnectionManager,然后调用 多万个 PoolHttpConnectionManager 对象,说明肯定是有地方把内次 n w OssClient 时新建的 PoolHttpConnectionManager 给缓存起来了,导致垃圾回收无能为力。
继续看源码,发现确实和我想的一样。给存起来了,只有显式调用 ossClient 的 shutdown,才会清理缓存。
想想这样设计也没问题,这和线程池的思想是一样的,我们使用线程池时,肯定不会每次都 的,我们使用线程池时,肯定不会每次都 new 一 新的,只不过这个 ossClient 隐藏的比较深。。解决
解决办法很简单,把 OssClient 改成单例就行了。
但是,集团封网期间不允许上线,这。。。 没办法,把应用重启一遍,JVM 内存满血复活,清醒 QPS 很低,重启后可以撑过封网的时间断了
0 码力 | 3 页 | 247.74 KB | 2 年前3
TypeScript 多场景设计方案及应用实践
☐ interface HsfClient { } interface DiamondClient { } interface TairClient { } interface OSSClient { }  ## 体验 ##0 码力 | 95 页 | 8.28 MB | 2 年前3
共 2 条
- 1













