Oracle內(nèi)存結(jié)構(gòu)中的Process Memoryde實操描述
我們都知道Oracle內(nèi)存結(jié)構(gòu)中的Process Memory,The Process Memory,除了應(yīng)用比較廣泛的SGA(System Global Area)之外,Oracle進程還經(jīng)常使用以下的三個全局區(qū):The Process Global Area (PGA);The User Global Area (UGA);The Call Global Area (CGA)。
很多人都搞不清楚PGA和UGA兩者之間的區(qū)別,實際上兩者之間的區(qū)別跟一個進程和一個會話之間的區(qū)別是類似的。盡管說進程和會話之間一般都是一對一的關(guān)系,但實際上比這個更復(fù)雜。一個很明顯的情況是MTS配置,會話往往會比進程多得多。
在這種配置下,每一個進程會有一個PGA,每一個會話會有一個UGA。PGA所包含的信息跟會話是無任何關(guān)聯(lián)的,而UGA包含的信息是以特定的會話為基礎(chǔ)的。
The PGA:進程全局區(qū)(PGA)即可以理解為Process Global Area,也可以理解為Program Global Area。它的內(nèi)存段是在進程私有區(qū)(Process Private Memory)而不是在共享區(qū)(Shared Memory)。它是個全局區(qū)意味著它包含了所有代碼有可能進入的全局變量和數(shù)據(jù)結(jié)構(gòu),但是它是不被所有進程共享的。
每個Oracle的服務(wù)器進程都包含有屬于自己的PGA,它只包含了本進程的相關(guān)特定信息。PGA中的結(jié)構(gòu)不需要由latches來保護,因為其它的進程是不能進入到這里面來訪問的。
PGA包含的是有關(guān)進程正在使用的操作系統(tǒng)資源信息以及進程的狀態(tài)信息,而其它的進程所使用的Oracle的共享資源是在SGA中。PGA是私有的而不是共享的,這個機制是有必要的,因為當進程死掉后可以把這些資源清除和釋放掉。
PGA包含兩個主要區(qū)域:Fixed PGA和Variable PGA或稱為PGA Heap。 Fixed PGA的作用跟Fixed SGA是類似的,都包含原子變量(不可分的),小的數(shù)據(jù)結(jié)構(gòu)和指向Variable PGA的指針。
Variable PGA是一個堆。它的Chunks可以從Fixed Table X$KSMPP查看得到,這個表的結(jié)構(gòu)跟前面有提到的X$KSMSP是相同的。PGA HEAP包含了一些有關(guān)Fixed Table的永久性內(nèi)存,它跟某些參數(shù)的設(shè)置有依賴關(guān)系。這些參數(shù)包含DB_FILES,LOG_FILES,CONTROL_FILES。
The UGA:UGA(User Global Area)包含的是特定會話的信息,有如下一些:
所打開游標的持續(xù)和運行時間內(nèi)的區(qū)域;
包的狀態(tài)信息,特定的變量;
Java會話狀態(tài);
可以用的ROLES;
被ENABLE的跟蹤事件;
起作用的NLS參數(shù)設(shè)置;
打開的DBLINK;
會話的入口控制。
跟PGA一樣,UGA也由兩區(qū)組成:Fixed UGA和Variable UGA,也稱為UGA HEAP。 Fixed UGA包含了大約70個原子變量,小的數(shù)據(jù)結(jié)構(gòu)和指向Variable UGA的指針。
UGA HEAP中的Chunks可以從它們自己的會話中通過查看表X$KSMUP獲得相關(guān)信息,這個表的結(jié)構(gòu)跟X$KSMSP是一樣的。UGA HEAP包含了一些有關(guān)fixed tables的永久性內(nèi)存段,跟一些參數(shù)的設(shè)置有依賴關(guān)系。這些參數(shù)有OPEN_CURSORS,OPEN_LINKS,和MAX_ENABLE_ROLES。
UGA在內(nèi)存中的位置依賴于會話的配置方式。如果會話連接的配置方式是專用服務(wù)器模式(DDS)即是一個會話對應(yīng)一個進程,則UGA是放在PGA中的。在PGA中,Fixed UGA是其中的一個Chunk,而UGA HEAP是PGA的一個子堆(Subheap)。如果會話連接是配置為共享服務(wù)器模式(MTS), Fixed UGA是SHARED POOL中的一個Chunk,而UGA HEAP則是SHARED POOL中的子堆(Subheap)
The CGA:
跟其它的全局區(qū)不同,Call Global Area是短暫性存在的。它只有在調(diào)用數(shù)據(jù)期間存在,一般是在對實例的最低級別的調(diào)用時才需要CGA,如下:
分析一個SQL語句;
執(zhí)行一個SQL語句;
取出一個SELECT語句的輸出。
一個單獨的CGA在遞歸調(diào)用時是需要的。在SQL語句的分析過程中,對數(shù)據(jù)字典信息的遞歸調(diào)用是需要的,因為要對SQL語句進行語法分析,還有在語句的優(yōu)化期間要計算執(zhí)行計劃。執(zhí)行PL/SQL塊時在處理SQL語句的執(zhí)行時也是需要遞歸調(diào)用的,在DML語句的執(zhí)行時要處理觸發(fā)器執(zhí)行也是需要遞歸調(diào)用的。
不管UGA是放在PGA中還是在SGA中,CGA都是PGA的一個子堆(Subheap)。這個事實的一個重要推論是在一個調(diào)用的期間會話必須是一個進程。對于在一個MTS的Oracle數(shù)據(jù)庫進程應(yīng)用開發(fā)時關(guān)于這一點的理解是很重要的。如果相應(yīng)的調(diào)用較多,就得增加processes的數(shù)量以適應(yīng)調(diào)用的增加。
沒有CGA中的數(shù)據(jù)結(jié)構(gòu),CALLS是沒法工作的。而實際上跟一次CALL相關(guān)的數(shù)據(jù)結(jié)構(gòu)一般都是放在UGA中,如SQL AREA,PL/SQL AREA和SORT AREA它們都必須在UGA中,因為它們要在各CALLS之間要一直存在并且可用。而CGA中所包含的數(shù)據(jù)結(jié)構(gòu)是要在一次CALL結(jié)束后能夠釋放的。例如CGA包含了關(guān)于遞歸調(diào)用的信息,直接I/O BUFFER等還有其它的一些臨時性的數(shù)據(jù)結(jié)構(gòu)。
Java Call Memory也是在CGA中。這一段內(nèi)存比Oracle的其它內(nèi)存段管理得更密集。它分成三個Space: Stack Space, New Space, Old Space。在New Space和Old Space中不再被參考使用的Chunks,根據(jù)它們在使用期間的長度及SIZE的不同,在調(diào)用的執(zhí)行過程中將被當成不用的Chunks收集起來。
New Space Chunks很多次的不用的Chunks的反復(fù)收集過程中沒有被收集的Chunks將會被放到Old Space Chunks中。這是在Oracle內(nèi)存管理中唯一的一個廢物收集(garbage collection),其它的Oracle內(nèi)存段都是釋放Dead Chunks。
Oracle內(nèi)存結(jié)構(gòu)中Process Memory Allocation
跟SGA不一樣的是,SGA在實例啟動之后SIZE就已經(jīng)是定下來的,而PGA的SIZE是會增長的。通過使用malloc()或者sbrk()系統(tǒng)調(diào)用來為進程增加堆數(shù)據(jù)段大小而使得PGA的SIZE的增長。OS的新虛擬內(nèi)存會被做為PGA HEAP中的一個新的區(qū)被加到PGA中來。這些區(qū)一般只幾KB大,如果有需要,Oracle將會給分配上千個區(qū)。
操作系統(tǒng)對每個進程的堆數(shù)據(jù)段的增長是有限制的。大部分的情況是操作系統(tǒng)的內(nèi)存參數(shù)進行限制(kernel parameter: MAXDSIZ),有一些情況它的缺省值是可以以每個進程為基準進行修改的。對于所有的進程,操作系統(tǒng)對整個虛擬內(nèi)存也有一個系統(tǒng)全局性的限制,這個限制跟系統(tǒng)的SWAP SPACE相關(guān)。一旦超過了這兩個限制,Oracle的進程在執(zhí)行中會遇到ORA-4030錯誤。
ORA-4030這個錯誤的產(chǎn)生一般不是因為每個進程的資源限制而是因為SWAP SPACE空間不足造成。為了診斷這個問題可以使用操作系統(tǒng)的一些選項來查看SWAP SPACE的使用情況。另外,在一些操作系統(tǒng)中,Oracle包含了一個工具叫maxmem,它可以用來查看每個進程可以被分配的堆數(shù)據(jù)段的最大SIZE以及哪一個限制是第一次超過的。
如果這個問題的出現(xiàn)是因為SWAP SPACE空間不足,而且換頁的動作非常頻繁而且較多,則需要減少系統(tǒng)一級的虛擬內(nèi)存的使用,這個可以通過減少進程數(shù)也可以通過減少每個進程的內(nèi)存限制。如果換頁動作不頻繁而且比較少,則需要調(diào)大SWAP SPACE SIZE。
Oracle內(nèi)存結(jié)構(gòu)中Process Memory Deallocation:
Oracle堆的增長比它們的收縮要來得容易,當然它們的SIZE也是可以收縮的。在V$MYSTAT和V$SESSTAT視圖中,session的統(tǒng)計信息session uga memory和session pga memory分別顯示了當前session的UGA和PGA的內(nèi)存大小,包含內(nèi)部的空閑空間。
相應(yīng)的統(tǒng)計信息session uga memory max 和 session pga memory max分別顯示了在session的生存期間所使用過得最大的UGA和最大的PGA。
UGA和PGA只有在特定的操作后才會收縮,這些操作如一次磁盤排序的合并操作,或者用程序DBMS_SESSION。FREE_UNUSED_USER_MEMORY顯示釋放內(nèi)存。只有整個free heap extent會被釋放給父堆或者是進程堆數(shù)據(jù)段,所以有一部分的內(nèi)部free space在內(nèi)存釋放后仍然存在于subheap中。
在大多的操作系統(tǒng)環(huán)境下,Oracle是不會減少進程堆數(shù)據(jù)段也不會釋放虛擬內(nèi)存并將其返還給操作系統(tǒng)的。所以從一個操作系統(tǒng)的查看中,一個Oracle的進程將會把虛擬內(nèi)存SIZE作為HWM而保留著。如果有必要時,Oracle是會將一些沒用的虛擬內(nèi)存頁換頁出去的。
因為這個原因,有關(guān)Oracle進程的虛擬內(nèi)存頁的操作系統(tǒng)統(tǒng)計信息都是很難理解的。所以一般用的是Oracle內(nèi)部統(tǒng)計信息來代替使用操作系統(tǒng)的統(tǒng)計信息。
程序DBMS_SESSION。FREE_UNUSED_USER_MEMORY只能在連接是配置為MTS模式的應(yīng)用才能使用。這個最好是少點使用,因為它只釋放大的包的array變量所占用的內(nèi)存返還給Large Pool或者是Shared Pool。一般地,UGA HEAP的內(nèi)存應(yīng)該首先被釋放,可以通過指派新的空array給array變量使用,也可以通過調(diào)用程序DBMS_SESSION。RESET_PACKAGE。
以上的相關(guān)內(nèi)容就是對Oracle內(nèi)存結(jié)構(gòu)中Process Memory的實際操作的描述,希望你會從中有所收獲。
原文出處:http://database.csdn.net/page/34a43a04-d93b-43f5-a51b-6c9e6ae21e23
【編輯推薦】
- 常見的ORACLE鎖模式匯總
- 三種ORACLE鎖機制細化解析
- 聯(lián)機備份Oracle數(shù)據(jù)實施是什么?
- Oracle移植到mysql中應(yīng)注意的事項
- Oracle 10g數(shù)據(jù)庫的相關(guān)內(nèi)容描述

















