不正确使用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被不正确的同步使用,导致死循环 卡死整个系统!

原文地址:https://www.cnblogs.com/love-jishu/p/4244302.html