天天看點

Oracle記憶體全面分析(12)4.   Dump記憶體解析

4.   Dump記憶體解析

下面以shared pool為例,解釋一下dump出來的記憶體結構。

以下時trace檔案的内容,我們分别解釋各個部分:

這部分是關于trace檔案的基本資訊,oracle版本、資源情況、使用者和會話等。

這部分記錄的是shared pool中的latch資訊。每個latch的具體資訊可以通過視圖V$LATCH、V$LATCH_PARENT、V$LATCH_CHILDREN或者表x$ksllt查出

這是堆dump資訊的頭部,heap name說明了記憶體所述的堆,shared pool是屬于SGA區的,是以,這裡是"sga heap";

extent sz記錄的是所有擴充段的大小。

這部分資訊是trace檔案中的主要部分,它詳細記錄了shared pool中各個chunk的資訊。

首先看它的頭部資訊,注意到這裡heap name是"sga heap(1,0)"。這是什麼意思呢?我們前面提到,oracle 10g會将shared pool分為幾個區來管理,這裡就是其中的一個區。共有4個區。通過表X$KGHLU可以看到對應的LRU連結清單。

這一行說明下面的chunk都屬于這個擴充段(extent),0是它的編号,addr是它的起始位址。

這是一個chunk的資訊,sz是這個chunk的大小(24位元組)。R-freeable是這個chunk的狀态,"reserved stoppe"是這個chunk的用途。Chunk有4種可能狀态,以下是這四種狀态的含義:

free:即空閑chunk,可以随時配置設定給适合大小的請求;

freeable:這種狀态的chunk表示它目前正在被使用,但是這種使用是短期的,比如在一次調用中或者一個會話中,會話或者調用解釋就可以被釋放出來。這種狀态的chunk是不放在LRU連結清單中的,一旦使用結束,自動成為free狀态,放到空閑清單中;

recreatable:這種狀态的chunk正在被使用,但是它所包含的對象是可以被暫時移走、重建,比如解析過的語句。它是被LRU連結清單管理的。

permanent:顧名思義,這種狀态的chunk所包含的對象是永遠不會被釋放的。即使flush shared pool也不會釋放。

我們注意到,這裡還有一些狀态是有字首“R-”的。帶有這種字首的chunk說明是shared pool中的保留區的chunk。

最後是這一shared pool區的總的大小。

接下來便是這個shared pool區的空閑清單。Bucket是一個空閑清單的範圍,例如Bucket 1,它的最小值是上一個Bucket的最大值,即16,最大值為20。Bucket下面是空閑清單中chunk,後面的資訊和前面解釋chunk的資訊一樣,8位的16進制數字是它的位址;sz是chunk的大小;free是chunk的狀态,因為是空閑清單中的chunk,這裡隻有一個狀态;最後是chunk的用途,因為都是free,是以肯定為空。

最後是這塊shared pool區中空閑chunk的總的大小。

Shared pool的普通區的空閑清單下面就是關于這塊shared pool區中保留區的空閑清單的描述,其中除了在名字上bucket前面都有一個Reserved辨別,和狀态前面有“R-”字首外,含義和普通空閑清單相同。

空閑清單後面就是LRU連結清單了。LRU連結清單不是按照大小分的,因而沒有Bucket。它的chunk是按照最近最少使用的順序排列。其中chunk的資訊和前面解釋的一樣。但是要注意一點,因為LRU連結清單中的chunk都是使用的,因為每個chunk根據用途不同,都會有一個latch來保護,Chunk資訊最後便是latch的位址。

注意,我們前面提到,shared pool中是有兩種LRU連結清單的,一種循環LRU連結清單;另外一種是暫時LRU連結清單。在這裡LRU資訊中前面部分是循環LRU連結清單,SEPARATOR後面部分是暫時LRU連結清單資訊。

最後是LRU連結清單中chunk的總的大小,rcr是循環LRU連結清單中的chunk數,trn是暫時LRU連結清單中的chunk數。

此外,有一點提示,如果是有多個shared pool區,第一個區是不含LRU連結清單資訊的。

最後是永久chunk的資訊。Chunk部分解釋和前面一緻。alo表示已經配置設定的大小。

如果有多個shared pool區,永久chunk資訊則隻存在于第一個shared pool區。

轉載自:http://www.hellodba.com/reader.php?ID=111&lang=CN

繼續閱讀