清理注册表注意事项 到底要不要清理注册表( 二 )


? 我不知道HKLM\\COMPONENTS是用来干啥的,甚至在注册表编辑器里都看不见,但它确实存在,望有高人指点 。
? 微软给出的hive的定义是注册表中键、子键和键值的逻辑组合,而并非指文件 。许多文章和论文都把hive当做hive文件本身,在不产生歧义的情况下倒也没有大碍 。
实验通常软件在安装时会在HKCU\\Software(即HKU\\%SID%\\Software)和HKLM\\SOFTWARE下写入自己必要的配置信息,如果没有足够的空间,注册表就以4KB为单位增长(所以我们在C盘看到的hive文件大小都是4K的整数倍);卸载时部分键项残留下来,形成垃圾,大有去公共厕所拉完屎不冲水的架势,简直人神共愤,如果注册表为其增长了n个4K,那么这增长的部分就得不到释放,注册表就越来越“臃肿”了 。
此时我尝试性地卸载了一个软件,注册表项也确实少了,可是hive文件岿然不动,甚至与近一个月前的大小一模一样 。

清理注册表注意事项 到底要不要清理注册表

文章插图
hive文件大小不变(NTUSER.DAT亦然)
尼玛这跟说好的不一样啊!难道是要重启?重启,不变,再重启,我在风中凌乱 。由于理论上注册表更新会每隔5秒写回hive文件,也明显可以看到hive文件的修改时间确实刷新了,所以重启不重启根本没有任何影响 。
是数据太小(不足4K就可能影响不了hive文件的体积)?事实上卸载前该软件的对应表项已经被我导出,确实超过4K 。为找出症结所在,我一鼓作气卸了好几个软件,C盘顿时多出2G空间 。这下总够了吧!谁料NTUSER.DAT还是那个NTUSER.DAT,SOFTWARE还是那个SOFTWARE 。
别拦我!我要去厕所哭晕……
可是这到底怎么解释呢?原来hive文件大小并不能代表实际注册表项的大小,从注册表编辑器导出对应的二进制文件,才可以看到表项在内存中真正的体积 。
清理注册表注意事项 到底要不要清理注册表

文章插图
hive文件大小不变(NTUSER.DAT亦然)
很好,可以明显地看到内存中的hive确实缩水了 。趁热打铁,在此基础上继续卸载一个暴风影音,卸载前先记录下其表项大小——32KB 。
清理注册表注意事项 到底要不要清理注册表

文章插图
暴风影音hive导出
事实证明本OS中暴风的装卸仅作用于HKCU,对应NTUSER.DAT,导出对比 。
清理注册表注意事项 到底要不要清理注册表

文章插图
hive文件体积对比(带2条下划线的即卸载暴风后导出者)
果然变小了,并且7944 – 7916 = 28 ≠ 32,这正是hive以4K为单位组织内容的表现 。
现在就让我们来看一看,软件卸载时留下的垃圾hive有多大 。我在注册表中找到几个早已卸载了的软件,多少年了,它们依然顽强地躺在那里 。
清理注册表注意事项 到底要不要清理注册表

文章插图
垃圾hive导出
可以看出垃圾hive说大也不大说小也不小……等一下,貌似我这些例子覆盖性并不太好,怎么都是8K啊!有兴趣的朋友可以导出一些自己电脑上的垃圾hive,以弥补这单调的画面 。
结论1) 对磁盘效率的影响到此为止,我们可以得出一个明显的结论,垃圾hive确实会增大注册表的体积,但磁盘上的hive文件似乎并不受影响 。系统固定了hive文件的体积,也许是为了提高存取效率,另一方面也可以减少磁盘碎片 。
2) 对内存效率的影响那么在内存中呢?在系统运行时,内存中保存着一份完整的注册表,这意味着磁盘上的hive文件会被整个读入内存,但准确地说进入的是分页池,而分页池中长时间用不到的内容会被替换到磁盘 。注册表中的垃圾项是永远也不会被访问到的,也就是说它们即使被加载到内存中,也必然会被换出到虚拟内存(磁盘),因此不会影响系统运行速度 。即使不被换出,内存中的注册表组织为Map结构:
清理注册表注意事项 到底要不要清理注册表

文章插图
装逼图:Cell Index Translation
类似通过“学校\\年级\\班级\\学号”的形式能快速定位一个学生,注册表项也能被快速定位,少数多余的垃圾项对查找速度并无多大影响 。
3) 对开机速度的影响那么注册表垃圾真的就人畜无害了?我想它们唯一能导致的负面影响是:增加了系统启动过程中加载注册表的时间 。而这份拖累有多少呢?CHIP有一张图很能直观地说明问题:
清理注册表注意事项 到底要不要清理注册表