咱們能夠經過show sga命令查看共享池的總體組成部分:數組
....待截圖....緩存
1、SGA內存結構session
Oracle中SGA主要包括:數據結構
一、固定數據結構部分(FIXED Size) 二、數據塊緩衝區(DATABASE BUFFER) 三、REDO LOG緩衝區(redo buffers) 四、共享池(在variable size中)。oracle
固定區域包含了全部其餘共享內存結構和重要的數據結構的地址和指針、資源、鎖等,可經過以下命令詳細列出具體內容:性能
select pool,name,bytes from v$segstat where pool = 'shared pool';spa
顧名思義,共享池是爲了讓你們共享數據而設置的緩衝池,並且共享池也是不少會話爲本身執行SQL分配共享內存的緩衝池,這些在共享池中分配的內存在會話之間使用十分頻繁,應實現一次分配屢次使用,而且能被實例中其餘會話共享。指針
2、SGA內存分配 對象
DB CACHE能夠根據數據塊大小很規則的均勻分配,所以不會出現碎片問題,並且DB CACHE分配與歸還相對簡單。但與DB CACHE不一樣,因爲各個會話在共享池中分配空間的時候所須要的空間差別很大,有時幾十字節,有時幾百字節甚至幾兆,所以共享池的分配歸還十分複雜。爲了確保共享池中共享數據的訪問性能,共享池的每次內存分配都必須是連續的內存空間,因爲這個特色,通過一段時間後,共享池中或多或少都會出現一些碎片,這些碎片分佈在一些連續分配的空間之間。進程
共享池中分配的內存空間有些事永久使用,不釋放的並標記爲PERMANENT,這些結構大可能是在實例啓動時分配的,也有些是系統運行過程當中分配的,但這些內存的特色是只分配,在實例關閉前不會釋放,例如:進程信息數據,會話數據,特殊內容的進程段。進程和會話信息是經過PROCESSES和session參數分配的,實例啓動時一次性分配,分配後不變更,也不會動態擴展,所以加大processes參數必需要重啓實例,另外有些特殊用途的內存數組也是在實例啓動時分配,是動態擴展的,只分配不釋放,在後續可動態擴展,例如:enqueues(locks),enqueue resource,transactions,transaction branches等,對於RAC還有gcs resource,ges resource等。若是這些動態擴展動做常常發生,將會在共享池的連續空間中產生大量的不可釋放的小碎片,從而致使共享池碎片化。(典型案例:9i中常常因爲ges resource擴展致使共享碎片問題,併產生4031錯誤。10.2版對此進行了改進,詳細理解請百度)
共享池中還有些是分配後可釋放的,這些內存被標記爲freeable或者recreateable。freeable是能夠直接釋放,recreateable的內存在unpin後也是能夠釋放的,所以他們都是能夠重用的內存。
2、共享池管理
共享池內存是經過ORACLE通用內存管理(generic oracle memory manager)來進行管理的,這個就是咱們總說的KGH heap manager。在KGH機制下,全部共享池的FREE內存都被掛在稱爲freelists的空閒鏈表上,這個空閒鏈表是按照bucket機制創建的,根據空閒內存片斷大小,掛在不一樣的Bucket上,例如:9i的共享池的freelists包含256個bucket,每一個bucket上鍊接了不一樣大小的空閒內存塊
*小於812B的Bucket是以4B爲步長增加的,如16B,20B,24B.....812B;
*超過812B的bucket是以64B爲步長增加的,如876B,940B,....4012B;
*超過4012B的bucket是以4096的倍數倍增的,如4108,8042,16396,32784,.....
當某個會話須要從共享池中分配空間的時候,會根據本身分配的大小找到某個bucket,而後找到一個空閒的內存,從中產生的剩餘內存,會被掛到相應的bucket上,供其餘會話分配使用,而被釋放的內存會被掛到freelists上,爲了避免碎片化,被釋放的內存自動合併,若是兩個內存片斷相鄰,ORACLE會將他們合併爲一塊兒。
共享池大小經過shared_pool_size參數定義,自動內存管理模式不用設置此參數,若是設置了此參數那麼共享池會根據這個參數做爲初始大小和最小值,不管內存如何調整,共享池大小都不能小於這個參數。
3、共享池內部結構(堆) /*此處很難待續...關注<DBA思想的天空>64頁*/
ORACLE內存空間分配時採用堆管理(HEAP)的模式,堆管理的基礎是KGH。ORACLE常見的內存堆包括SGA HEAP,PGA HEAP,另外大部分表也是堆表(HEAP TABLE),其空間管理的基本概念都是使用KGH。
4、共享池轉儲文件簡單說明
轉儲文件有幾百兆深圳幾個G,共享池的內容轉儲到文件的基本命令,用以下命令能夠把LIBRARY_CACHE的內容轉儲到TRACE文件中:
ALTER SESSION SET EVENTS 'immediate trace name LIBRARY_CACHE level <level>';
其中level表明級別,9.2版本後不一樣level含義以下
* level=1 轉儲庫緩存統計信息
* level=2 轉儲散列表概要
* level=4 轉儲庫緩存對象,只包含基本信息
* level=8 轉儲庫緩存對象,包含詳細信息(包括child reference,pin waiters等)
* level=16 增長堆大小信息
* level=32 增長堆信息