注冊表是Windows操作系統的一個核心數據庫,記載着機子的硬件信息、系統配置、用戶配置等各種“高大上”的數據。對于Windows用戶來說,如果不會手動修改個注冊表項,簡直都不好意思自稱“電腦高手”。“高手”們熱衷于通過regedit提升電腦運行速度、DIY系統配置,把0改成1,把1改成2,狂拽炫酷;而包括我在内的“低手”們隻得望其項背,據說保不齊能把系統改癱了,輕易不敢碰得,但有一項技能是可以輕松get的,那就是使用第三方軟件清理注冊表垃圾,這麼做也多少能提升一點逼格,畢竟還有好多人不知道注冊表這東西呢!
可正當大家一緻認為清理注冊表有助于提高系統性能,正當我們抱着這份信念每天happy地做着清理時,有人卻發出了“清理注冊表毫無用處”的觀點。唯一的逼格被否定了,坑爹呢這是!我抱着辯證批判的态度讀完那些帖子,發現其中并未給出真正令人信服的原理。那麼問題來了,我到底該信啥?
注冊表垃圾,就是指軟件卸載後殘留在注冊表内的無用項,如果不進行清理,各種軟件裝了卸裝了卸,日積月累,注冊表在體積上肯定會變大。關鍵是,注冊表會變得多大?變大後對系統性能的影響有多少?為了搞清楚這些問題,首先需要理解注冊表的組成結構。
内存中的注冊表也許你每天清理着注冊表垃圾,其實卻根本不知道注冊表這個“隐秘而偉大”的東西到底在哪。徽标鍵 R,運行regedit,Look!這就是傳說中的注冊表!其實準确地說這時打開的隻是注冊表編輯器,以一種便于查看和修改的形式呈現着注冊表數據。
注冊表編輯器
考慮到有朋友可能從未接觸,簡單普及一點基礎知識:注冊表組織結構好比文件系統,其中鍵的概念相當于文件夾,鍵值相當于文件夾裡的文件,那麼根鍵就好比根目錄,子鍵就好比文件夾下的子文件夾,組織起來成樹狀結構,并不是什麼高深的東西。
下面我們詳細介紹這映入眼簾的五個根鍵。
首先需要提到符号鍵的概念,HKEY_CLASSES_ROOT、HKEY_CURRENT_USER及HKEY_CURRENT_CONFIG這三個根鍵本質上是另兩個根鍵中部分内容的鍊接,并不獨立存在,相當于Windows文件系統中快捷方式的概念。不光是根鍵,根鍵下的部分子鍵在其他地方也會有對應的符号鍵,這意味着注冊表編輯器所展示的内容有很多是重複的,有些甚至重複了不止兩次。
根鍵的鍊接關系
注冊表中真正保存數據的隻有HKEY_LOCAL_MACHINE和HKEY_USERS兩個根鍵,所以我們說注冊表編輯器所展示的不是注冊表本身,而是一個更易于查看和編輯的注冊表視圖。下表就是各根鍵的功能說明。
表:根鍵簡介
注:XP、Vista、Win7、甚至64位和32位系統下的注冊表組成均略有不同,這裡以Win7為主,并盡量體現各系統間的共通點。
hive文件到現在為止,我們看到的都是在内存裡的東西,既然注冊表是一個存儲信息的數據庫,那麼在磁盤上就應該能夠找到對應的文件。沒錯,就在C盤,不是一個,是一堆(部分可能還被隐藏了起來),我們稱之為hive文件。hive直譯過來就是蜂巢的意思,裝逼一點就譯成“儲巢”,當然最明智的做法還是不翻譯。
為什麼叫hive呢?相傳有個Windows工程師十分讨厭蜜蜂,于是他的同事惡作劇,引入了蜂窩(hive)……當然有觀點認為是因為鍵與鍵值組織為B-tree(諧音Bee-tree)結構,倒是十分專業的樣子,但我更樂意相信第一種解釋。
廢話太多了,趕緊來扒一扒HKLM和HKU下各個子鍵所對應的文件吧。
表:鍵與hive文件的對應關系
說明:
☞ hive文件包括不帶後綴名的數據存儲文件(如BCD、SAM)以及相應的還有帶各種後綴(.LOG、.LOG1、.LOG2、.blf、.regtrans-ms等)的輔助文件,輔助文件各有作用,不再本文讨論範圍。
☞ hive文件都是二進制格式的,一般軟件打不開的哦!
☞ 可以看到,注冊表中幾乎所有内容在磁盤上都有着相應的hive文件,除了HKLM\HARDWARE。這裡有個比較重要的概念:volatile hive。這一類hive不在磁盤上留有數據,而是在每次開機時動态收集環境信息,隻存在于内存中。(想來也是,本來開機時計算機會做一個加電自檢,檢測所有硬件。)所以說,hive文件并不能代表注冊表的全部,完整的注冊表隻存在于内存中。
☞ 我不知道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有一張圖很能直觀地說明問題:
垃圾項占比示意圖(來自CHIP)
通常整個注冊表在百兆左右,而垃圾項估計也占不了百K,兩者是千分之一量級的關系。即使整個開機時間(假設為1分鐘)都在用來加載注冊表,清理垃圾項卻僅能帶來0.06秒的速度提升,确實隻能起到心理安慰的作用了。
但即便如此,清理注冊表依然具有兩大顯著功效:
1) 許多大型專業軟件都有“潔癖”,在重裝時需要徹底清理;
2) 對于強迫症用戶,幹掉垃圾項是件很爽的事。
,