背景
在工作中遇到了服务流量高的时候,TP999就会增长,但是CPU并没有遇到瓶颈,且TP99也是正常的,说明系统有一些阻塞点导致了长尾流量延迟问题的发生。
分析
通过分析,发现youngGC时间高峰期会增加明显,特别是单次GC的平均时间超过了40ms,而TP99也就20ms,所以GC的情况下就会导致当时的请求时间拉长。基于此,针对youngGC进行了学习,分析一下为什么单次GC的时间会拉长。
通过GC日志确认,每次GC的时候,存活对象占用的内存有好几百兆,这些存活对象是需要复制到survive区,查阅资料得到,GC复制100M的数据,大约需要10ms。所以原因是复制存活对象花的时间太长了,根本原因就是存活对象太多了。
解决
存活对象多的原因是使用的本地缓存,有大量的对象并未过期。为了降低GC时间长的问题,就需要减少存活对象的占比。因此,我们将本地缓存中的对象设置为弱引用类型,这样,在每次GC的时候,只要该对象没有没有强引用,就会立马被GC清理掉,从而减少存活的对象,进而解决的长尾延迟的问题。