一次频繁Full GC问题排查过程分享

2018-11-06  本文已影响0人  卧颜沉默

问题描述

问题排查

问题初步解决

初步解决后的思考,为什么会有这个问题?

根源问题重现

    import java.util.Map;
    import java.util.concurrent.*;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 线程池通过submit方式提交任务,会把Runnable封装成FutureTask。
     * 直接导致了Runnable重写的toString方法在afterExecute统计的时候没有起到我们想要的作用,
     * 最终导致几乎每一个任务(除非hashCode相同)就按照一类任务进行统计。所以这个metricsMap会越来越大,调用metrics接口的时候,会把该map转成一个字符返回
     */
    public class GCTest {
        /**
         * 统计各类任务已经执行的数量
         * 此处为了简化代码,只用map来代替metrics统计
         */
        private static Map<String, AtomicInteger> metricsMap = new ConcurrentHashMap<>();
    
        public static void  main(String[] args) throws InterruptedException {
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>()){
                /**
                 * 统计各类任务执行的数量
                 * @param r
                 * @param t
                 */
                @Override
                protected void afterExecute(Runnable r, Throwable t) {
                    super.afterExecute(r, t);
                    metricsMap.compute(r.toString(), (s, atomicInteger) ->
                            new AtomicInteger(atomicInteger == null ? 0 : atomicInteger.incrementAndGet()));
                }
            };
            /**
             * 源源不断的任务添加进线程池被执行
             */
            for (int i =0; i < 1000; i++) {
                threadPoolExecutor.submit(new SimpleRunnable());
            }
            Thread.sleep(1000 * 2);
            System.out.println(metricsMap);
            threadPoolExecutor.shutdownNow();
        }
        static class SimpleRunnable implements Runnable{
    
            @Override
            public void run() {
                System.out.println("SimpleRunnable execute success");
            }
            /**
             * 重写toString用于统计任务数
             * @return
             */
            @Override
            public String toString(){
                return this.getClass().getSimpleName();
            }
        }
    }

最终解决

总结

版权声明
作者:wycm
github:https://github.com/wycm
出处:https://www.jianshu.com/p/3f7a4d33b121
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

上一篇 下一篇

猜你喜欢

热点阅读