dictionary造成cpu过高

而当数据损坏的时候,灾难是不可预测的。举个例子,比如Dictionary内部用了很多的类似代码:

 1         private void Insert(TKey key, TValue value, bool add)
 2         {
 3             int freeList;
 4             if (key == null)
 5             {
 6                 ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
 7             }
 8             if (this.buckets == null)
 9             {
10                 this.Initialize(0);
11             }
12             int num = this.comparer.GetHashCode(key) & 0x7fffffff;
13             int index = num % this.buckets.Length;
14             int num3 = 0;
15             for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next)
16             {
17                 if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
18                 {
19                     if (add)
20                     {
21                         ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
22                     }
23                     this.entries[i].value = value;
24                     this.version++;
25                     return;
26                 }
27                 num3++;
28             }
29             if (this.freeCount > 0)
30             {
31                 freeList = this.freeList;
32                 this.freeList = this.entries[freeList].next;
33                 this.freeCount--;
34             }
35             else
36             {
37                 if (this.count == this.entries.Length)
38                 {
39                     this.Resize();
40                     index = num % this.buckets.Length;
41                 }
42                 freeList = this.count;
43                 this.count++;
44             }
45             this.entries[freeList].hashCode = num;
46             this.entries[freeList].next = this.buckets[index];
47             this.entries[freeList].key = key;
48             this.entries[freeList].value = value;
49             this.buckets[index] = freeList;
50             this.version++;
51             if ((num3 > 100) && HashHelpers.IsWellKnownEqualityComparer(this.comparer))
52             {
53                 this.comparer = (IEqualityComparer<TKey>) HashHelpers.GetRandomizedEqualityComparer(this.comparer);
54                 this.Resize(this.entries.Length, true);
55             }
56         }

for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
          ...
}
如果entries[i].next不幸地指向它自己,那么该for循环就是一个死循环,导致CPU高就不奇怪了。

时间: 2024-08-02 02:44:16

dictionary造成cpu过高的相关文章

w3wp占用CPU过高

w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记录的更全面些. 上两次的博文链接:记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全).EntityFramework中的线程安全,又是Dictionary. 首先请大家不要喷我,因为这一次还是关于Dictionary的一些低级错误,我自己看到都无语了..

STORM在线业务实践-集群空闲CPU飙高问题排查(转)

最近将公司的在线业务迁移到Storm集群上,上线后遇到低峰期CPU耗费严重的情况.在解决问题的过程中深入了解了storm的内部实现原理,并且解决了一个storm0.9-0.10版本一直存在的严重bug,目前代码已经合并到了storm新版本中,在这篇文章里会介绍这个问题出现的场景.分析思路.解决的方式和一些个人的收获. 背景 首先简单介绍一下Storm,熟悉的同学可以直接跳过这段. Storm是Twitter开源的一个大数据处理框架,专注于流式数据的处理.Storm通过创建拓扑结构(Topolog

Nodejs mkdirP 模块导致CPU占用高的问题

Nodejs mkdirP 模块导致CPU占用高的问题 近期将nodejs项目部署到服务器上并启动时,发现node进程的cpu占用率在40%左右,当时表示非常不解,刚启动的服务并没有运行什么需要大量消耗cpu的逻辑,且此时还未有请求发送到服务器端. 鉴于这种情况,只能猜测是某段程序在初始化一些东西的时候异常,所以才导致了这种情况. 经过对代码的排查后,最终锁定出为题的代码块如下: router.use(multer({ dest: config.uploadDir, limits:{ fileS

word与spoolsv.exe占CPU过高

今天一同事说office中word打不开了,excel打开没问题. 当时情况如下: word和spoolsv.exe两进程占CPU程序过高,明显是因为spoolsv.exeCPU占用率异常导致的word假死. 通过上述问题得出: 1.不是offic软件问题,所以重装也没用.(因为当时尝试关闭spoolsv.exe之后打开word正常,但是只要spoolsv.exe进程重新启动,word就假死) 2.没有中毒或者木马.(在网上查找这方面的时候都说是中了木马或者病毒,查找了msconfig开机启动项

SQLSERVER排查CPU占用高的情况

SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用也很高,占用了30个G -----------------------------------------------华丽的分割线-------------

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 1.jps 获取Java进程的PID. 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈. 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高. 4.echo "obase=16; PID" | bc 将线程的PID转换为16进制. 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID.找到对应的线程栈. 6.分析负载高

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================

[转]生产环境中程序占用cpu过高的程序的排查办法

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环.以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线程列表: ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程28802,占用CPU时间快两个小时了!

[转]定位占用oracle数据库cpu过高的sql

今天在吃饭的时候我的朋友的数据库出现了问题,cpu占用率为97%,当我看到这个问题的时候我就想到了或许是sql导致的此问题,由于忍不住吃饭,暂时没有帮他看这个问题,这是我饭后自己模拟的故障,进行的分析: 1)查看一下cpu进程占用情况: 看到oracle进程为6331,6517等这几个进程占用cpu过高. 2)查看相关进程信息: [[email protected] ~]$ ps -ef | grep 6331 oracle 6331 1 23 20:24 ? 00:02:05 ora_vktm