不正确使用WeakHashMap引起的卡死

时间:2023-02-21 10:26:19

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

不正确使用WeakHashMap引起的卡死的更多相关文章

  1. 5 使用ip代理池爬取糗事百科

    从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...

  2. eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法

    关于 eclipse启动卡死的问题(eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法),自己常用的解决方法: 方案一(推荐使用,如果没有这个文件,就使用方案二): 到<works ...

  3. 【大坑】DataGridView多线程更新修改Cell单元格卡死

    最新发现是Column的AutoSizeMode设置为AllCell调整宽度而造成的卡顿,还有就是在现在里面使用Invoke用匿名函数闭包的形式访问For循环的i变量值会不正确导致找不到索引而造成卡顿 ...

  4. LoadRunner 录制IE 8卡死

    LoadRunner11录制脚本,对IE的版本是有所限制的,它只是支持IE 8 以下版本,其中包括IE 8,高出IE 8版本Loadrunner是不支持的. 我遇到LoadRunner录制脚本时IE8 ...

  5. Dreamweaver8卡死打开初始化&lpar;缓存重建&rpar;失败的解决的方法

    无论是中文版的dreamweaver 8,还是英文版本号的dw8或绿色版本号的DW8,都可能出现打开时卡死无法启动的情况,这个bug的出现是由于先前你以前在使用dreamweaver 8的时候,定义了 ...

  6. JAVA提高十九:WeakHashMap&amp&semi;EnumMap&amp&semi;LinkedHashMap&amp&semi;LinkedHashSet深入分析

    因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...

  7. VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时

    之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...

  8. 解决 Ubuntu 经常 卡死

    ubuntu 的卡死可能与显卡驱动不兼容有关. 这里提供2种方式, 1.禁用原来自带的nouveau显卡驱动sudo gedit /etc/modprobe.d/blacklist.conf在最后一行 ...

  9. 【问题解决:启动卡死】Eclipse启动卡死的解决办法

    问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...

随机推荐

  1. &lowbar;config&period;json

    { "AUTH": "66D86F40DF42A6103C2B0C2F16E41472DABF0594C79859E5EF51E06B377215F3B464E3F0F3 ...

  2. FAT32,NTFS,EXT3,支持的最大分区和单个文件大小?

    FAT32 Filesystem: 最大单一档案大小 4GB 最大文件系统总容量 128GB NTFS Filesystem: 最大单一档案大小 64GB 最大文件系统总容量 2TB Ext3 Fil ...

  3. PHP学习笔记14-操作session

    PHP会话管理图: 创建index: <?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/7/2 * Time ...

  4. linux安全配置检查脚本&lowbar;v0&period;8

    脚本环境:RHEL6.* 脚本说明:该脚本作用为纯执行检测不涉及更改配置等操作,与直接上来就改安全配置等基线脚本相比相对安全一些.虽然如此,在你执行该脚本之前仍然建议你备份或快照一下目标系统. 代码部 ...

  5. 属性动画QPropertyAnimation

    属性动画QPropertyAnimation 改变大小.颜色或位置是动画中的常见操作,而QPropertyAnimation类可以修改控件的属性值 大小改变动画: import sys from Py ...

  6. 关于RabbitMQ关键性问题的总结

    摘要:本篇是本人对RabbitMQ使用的关键性问题进行的总结,如性能上限.数据存储.集群等, 具体的RabbitMQ概念.安装.使用方法.SpringAMQP配置,假设读者已有了基础. 1.      ...

  7. winform最小化后重复进load事件原因

    最近编写一个工具发现的问题,窗体不论是最小化还是进入托盘,重新打开的时候都会进入控件load事件. 产生这个现象的条件是: 1.使用了用户控件,在控件中使用了load事件 2.在主窗体中,隐藏或显示任 ...

  8. CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视

    一.需求无论何时,当你在Explorer窗口中创建.删除或重命名一个文件夹/文件,或者插入拔除移动存储器时,Windows总是能非常快速地更新它所有的视图.有时候我们的程序中也需要这样的功能,以便当用 ...

  9. thymeleaf传值onclick到js

    带有单引号 targetUrl('val') <a th:onclick="'javascript:targetUrl(\''+${indexURL.value}+'\');'&quo ...

  10. 阿里云堡垒机密钥连接ECS服务器

    文:铁乐与猫 2017-6月中旬 堡垒机远程桌面windows系统就不用细说了 堡垒机远程ssh连接linux系统倒要说一下,毕竟是为安全一般只用通过密钥连接,而不使用密码的方式连接. 首先我们得在需 ...