有幸遇到jdk bug的一些总结和反思

有幸遇到jdk bug的一些总结和反思

1 遇到一个jdk bug-过程描述

最近工作中出现一个问题,抓包发现所有的tcp报文,都出现重传现象,怀疑是cpu出现异常,因此特地查看top命令,发现果真是cpu100%. 通过jstack定位发现是一个线程池出现了问题。具体jdk定位工具实用见博客的相关定位思路!

jdk问题定位工具箱-线程挂死、堆栈满问题定位

检查出现位置的线程,我们没有发现特别的问题,工作线程的设置、具体执行内容都是很简单的逻辑,因此我们把怀疑定位到了该问题的特殊初始化———这是一个线程池核心线程数为0的线程池ScheduledThreadPoolExecutor。通常我们初始化一个线程池的时候,通常是会添加一个参数给定相关大小的,但是该开发同学出于节省线程资源的考虑,给定的核心线程为0.

在排除了所有的问题后,这里成为了我们的最大的一个怀疑点。

因此赶紧google相关关键词,后来发现jdk果真存在一个这样的bug;

https://stackoverflow.com/questions/53401197/scheduledexecutorservice-consumes-100-cpu-when-corepoolsize-0

通过搜索还有另外一个问题与之相关:

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7091003

如下图是官方给出的jdk bug的一个描述样例代码

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

class ScheduledExecutorTest {
    public static void main(String[] args) throws InterruptedException {
        final ScheduledExecutorService ex = Executors.newScheduledThreadPool(0);
        ex.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello");
            }
        }, 1, TimeUnit.SECONDS);

        ex.shutdown();
        ex.awaitTermination(5, TimeUnit.SECONDS);
    }
}


2 jdk bug数据库备忘

列出本文的问题需要说明的一个问题是我们平时java开发的jdk这些实际上也是别人开发的源码,也难免遇到各种问题,所以遇到问题需要抱着不迷信、不盲从、科学分析、客观判断的方式对待问题,这里列出了一些jdk的bug库,作为日后学习定位问题过程中的一个参考,如果有问题,找遍了所有的问题,还可以想想—是不是jdk本身的bug??

jdkbug数据库

stackoverflow链接

3 问题总结及思考

1- 科学方法定位问题,在排除了所有其它非人为因素,可以在jdk bug库里面搜索一下,看看是不是jdk的问题,但是一般情况下很难到这一步---如果真有幸到这里了,恭喜你!你很幸运!!

2- 尽量使用新一点的软件版本,不管是jdk还是平时我们用的软件,新版本肯定会修复很多问题,所以要善于接受新事物

3- 没事看看jdkbug 库是一个好习惯

发布了88 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xinquanv1/article/details/104118893