zoukankan      html  css  js  c++  java
  • 不正确使用WeakHashMap引起的卡死

    公司的jenkins今天出了一点问题,起来以后,总是处于等待状态,所有的任务无法正常加载。登陆界面也出不了。而且cpu占用率100%

    把线程导出来,看到:

    “Loading job NMS_Patchset_Build” – Thread t@25
    java.lang.Thread.State: BLOCKED
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:96)
    - waiting to lock <36c782a4> (a java.util.HashMap) owned by “Loading job CG_Daily_Build_Gitolite_Klocwork” t@23
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:31)
    at hudson.model.Job.onLoad(Job.java:209)
    at hudson.model.AbstractProject.onLoad(AbstractProject.java:296)
    at hudson.model.Project.onLoad(Project.java:90)
    at hudson.model.Items.load(Items.java:221)
    at jenkins.model.Jenkins$18.run(Jenkins.java:2553)
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
    at jenkins.model.Jenkins$7.runTask(Jenkins.java:895)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

    Locked ownable synchronizers:
    - locked <54aba0ac> (a java.util.concurrent.ThreadPoolExecutor$Worker)

    “Loading job CG_Daily_Build” – Thread t@24
    java.lang.Thread.State: BLOCKED
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:96)
    - waiting to lock <36c782a4> (a java.util.HashMap) owned by “Loading job CG_Daily_Build_Gitolite_Klocwork” t@23
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:31)
    at hudson.model.Job.onLoad(Job.java:209)
    at hudson.model.AbstractProject.onLoad(AbstractProject.java:296)
    at hudson.model.Project.onLoad(Project.java:90)
    at hudson.model.Items.load(Items.java:221)
    at jenkins.model.Jenkins$18.run(Jenkins.java:2553)
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
    at jenkins.model.Jenkins$7.runTask(Jenkins.java:895)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

    Locked ownable synchronizers:
    - locked <2e71d99e> (a java.util.concurrent.ThreadPoolExecutor$Worker)

    “Loading job CG_Daily_Build_Gitolite_Klocwork” – Thread t@23
    java.lang.Thread.State: RUNNABLE
    at java.util.WeakHashMap.put(WeakHashMap.java:520)
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:102)
    - locked <36c782a4> (a java.util.HashMap)
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:31)
    at hudson.model.Job.onLoad(Job.java:209)
    at hudson.model.AbstractProject.onLoad(AbstractProject.java:296)
    at hudson.model.Project.onLoad(Project.java:90)
    at hudson.model.Items.load(Items.java:221)
    at jenkins.model.Jenkins$18.run(Jenkins.java:2553)
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
    at jenkins.model.Jenkins$7.runTask(Jenkins.java:895)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

    Locked ownable synchronizers:
    - locked <38b3b19e> (a java.util.concurrent.ThreadPoolExecutor$Worker)

    “Loading job NMS_GuangZhou_Patchset_Build” – Thread t@22
    java.lang.Thread.State: BLOCKED
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:96)
    - waiting to lock <36c782a4> (a java.util.HashMap) owned by “Loading job CG_Daily_Build_Gitolite_Klocwork” t@23
    at hudson.plugins.throttleconcurrents.ThrottleJobProperty.setOwner(ThrottleJobProperty.java:31)
    at hudson.model.Job.onLoad(Job.java:209)
    at hudson.model.AbstractProject.onLoad(AbstractProject.java:296)
    at hudson.model.Project.onLoad(Project.java:90)
    at hudson.model.Items.load(Items.java:221)
    at jenkins.model.Jenkins$18.run(Jenkins.java:2553)
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
    at jenkins.model.Jenkins$7.runTask(Jenkins.java:895)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

    Locked ownable synchronizers:
    - locked <47704765> (a java.util.concurrent.ThreadPoolExecutor$Worker)

    在加载的几个任务中,只有一个是runnable的(CG_Daily_Build_Gitolite_Klocwork)。他占了一个锁,导致其他的线程都无法继续运行了。这个CG_Daily_Build_Gitolite_Klocwork一直不结束。而且卡在

    at java.util.WeakHashMap.put(WeakHashMap.java:520)

    是jdk的代码,到里面去看看:在差不多520行的地方,这个put()是这么写的:

    1
    2
    3
    4
    5
    6
    7
    8
    for (Entry&lt;K,V&gt; e = tab[i]; e != null; e = e.next{
    if (h == e.hash &amp;&amp; eq(k, e.get()){
    V oldValue = e.value;
    if (value != oldValue)
    e.value = value;
    return oldValue;
    }
    }

    乍看之下,好像没啥问题,但是如果当e.next指向e自己,或者 这个链表成环的时候,这就是一个死循环!!
    这个死循环好隐蔽呀!
    大家可能会问,为什么会成环呢?难道jdk的实现有问题?不会那么大的错误吧!
    这其实是因为WeakHashMap不是线程安全的,如果在多线程里乱用,数据就有可能被破坏,破坏的结果就是可能成环。导致一个死循环。
    因此,这个问题的推断结论就是因为WeakHashMap被不正确的同步使用,导致死循环 卡死整个系统!

  • 相关阅读:
    bzoj2564: 集合的面积(闵可夫斯基和 凸包)
    省选前做题记录
    loj#2978. 「THUSCH 2017」杜老师(乱搞)
    loj#6437. 「PKUSC2018」PKUSC(计算几何)
    洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)
    loj#6436. 「PKUSC2018」神仙的游戏(NTT)
    洛谷P4459/loj#2511 [BJOI2018]双人猜数游戏(博弈论)
    洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)
    洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)
    loj#6435. 「PKUSC2018」星际穿越(倍增)
  • 原文地址:https://www.cnblogs.com/love-jishu/p/4244302.html
Copyright © 2011-2022 走看看