【記憶體管理】Oracle AMM自動記憶體管理詳解
一、 Oracle 的三種記憶體管理方式
oracle 記憶體管理有三種方式,每一個 instance 只能夠選擇一種。這三種管理方式分別是 AMM 自動記憶體管理( Automatic Memory Management )、 ASSM 自動共享記憶體管理( Auto Shared Memory Management )、 msmm 手動共享記憶體管理( Manual Shared Memory Management )。
本文針對AMM 自動記憶體管理進行詳細原理闡述。
二、 AMM 原理闡述
自動記憶體管理automatic memory management (以下均稱 AMM )是 oracle 11g 新推出的新特性,意在對例項中的 PGA 和 SGA 進行自動管理。 AMM 是自動共享記憶體管理 automatic shared memory management ( ASMM )的擴充。
1. 在AMM 中涉及到的引數
- memory_max_target
- memory_target
- sga_max_size
- sga_target
- pga_aggregate_target
2. AMM 的啟用
方式一 :DBCA 圖形介面下,要選擇 AMM 自動記憶體管理, step9 選擇 use Automatic Memory Management 即可。如下圖
方式二 :可以透過以下兩個引數之一啟用
- memory_target :定義 sga 和 pga 總和的上限
- memory_max_taregt :定義 memory_target 的上限
假設memory_max_target 設定為 1400m , memory_target 設定為 1000m ,那麼只有 1000m 會被用在 instance 中,剩下的 400m 會被 oracle 用做儲備。因為 memory_max_target 已經指定了,所以可以動態的修改 memory_target 引數,而不需要重啟資料庫。
如果memory_max_target 和 memory_target 相同,或者 memory_max_target 沒有設定,那麼 memory_target 就不能動態增長,並且修改後需要重啟 instance 。
memory_max_target 將一直在引數檔案中顯式設定,或者被記憶體管理後臺程式隱式設定。 memory_max_target 會定義 instance 鎖定的記憶體。如果 memory_max_target 沒有在引數檔案中設定,那麼他的大小預設為 mrmory_target 。
3. AMM 的選項引數
所有的SGA 記憶體引數都會設定在 AMM 環境,如果 SGA 引數沒有被設定,那麼記憶體管理器將會進行以下設定:
60% to sga_target
40% to pga_aggregate_target
其他選項引數如下:
- sga_max_size :這個引數設定 memory_target 中 SGA 的上限
- sga_target :這個引數設定 memory_target 中的下限
- pga_aggregate_target :這個引數僅是 instance 允許所有程式使用記憶體的總量。在 AMM 中,這個引數將隨著 memory_target 的空閒空間進行浮動。
SGA 和 PGA 的總量不能超過 memory_target 。如果 sga_target 在引數檔案中設定,它將代表著 SGA 的下限。此時 pga_aggregate_target 將會獲得的記憶體 = ( memory_target - sga_target )
4. 透過memory_target 控制記憶體
DBA 可以透過一些選項去決定如何對記憶體中的各個元件進行分配。可以透過 MEMORY_TARGET 來控制 PGA 和 SGA 的增長。由於 memory_target 同時管理者 PGA 和 SGA ,記憶體控制器可以自由的在兩者之間進行記憶體控制,沒有任何的限制。如果要限制 PGA 的增長,可以設定 sga_target 引數大小,這就限制了 SGA 的最小值。在這種情況下, PGA 就算增長,也不能讓 SGA 縮小到超過他的最小值。如果要限制 SGA 的增長,可以設定 sga_max_size 的大小,這是 SGA 的上限值。
如果想要設定SGA 中某個元件的最小值,也可以進行單獨設定。 SGA 中重要的元件如下:
- shared pool (透過 shared_pool_size 引數管理)
- buffer cache (透過 db_cache_size 引數管理)
- streams pool (透過 streams_pool_size 引數管理)
- java pool (透過 java_pool_size 引數管理)
- large pool (透過 large_pool_size 引數管理)
三、 實驗測試
情況一
只設定memory_target
- memory_target =1G
memory_max_target 不設定,所以它會被預設設定大小為 memory_target 。
執行以下SQL :
SQL> show parameter memory;
NAME TYPE VALUE
-------------------- -- -- ----------- ----------------------
hi_shared_memory_address integer 0
memory_max_target big integer 1G
memory_target big integer 1G
shared_memory_address integer 0
SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';
NAME BYTES RES
-------------------------------- ---------- ---
Maximum SGA Size 1068937216 No
Free SGA Memory Available 432013312
SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';
COMPONENT CURRENT_SIZE
------------------------------------------------ ------------
SGA Target 641728512
PGA Target 432013312
總結 :
1) 初始所有的記憶體(1G )會作為共享記憶體分配, v$sgainfo 顯示 SGA 最大值為 1G ,因為 sga_max_size 沒有設定,因此預設 sga 最大值為 memory_target 。
2) v$sgainfo 顯示,有 412M 是空閒的記憶體,這些空閒的記憶體可以用在 PGA ,或者動態的設定 SGA 。
3) 記憶體的初始比是60% 給 SGA,40% 給 PGA 。在 sga_target 和 pga_aggregate_target 沒有設定的情況下,這是預設的情況。這也就意味著,記憶體的 60% ( 612M )給 SGA ,記憶體的 40% ( 412M )給 PGA 。
4) v$memory_dynamic_components 顯示sga_target 設定 612M , pga_aggregate_target 設定 412M 。這裡的 pga_aggregate_target 設定為 412M 不意味著 PGA 已經達到了 412M 。而是說明有 412M 空間可以給 PGA 增長。如果它增長超過 412M ,那麼記憶體控制器將會從 SGA 中獲取記憶體。
情況二
設定以下引數
- memory_target=1G
- sga_target=300M
- pga_aggregate_target=100M
memory_max_target 不設定,所以它預設值等於 memory_target 。
執行以下SQL :
SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';
NAME BYTES RES
-------------------------------- ---------- ---
Maximum SGA Size 1068937216 No
Free SGA Memory Available 759169024
SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';
COMPONENT CURRENT_SIZE
------------------------------------------------- ------------
SGA Target 314572800
PGA Target 759169024
總結:
1) 初始所有記憶體(1G )會被作為共享記憶體分配。 v$sgainfo 顯示, SGA 最大值為 1G ,因為 SGA_MAX_SIZE 沒有設定,所以它預設大小等於 memory_target 。
2) v$sgainfo 顯示 724M 為空閒記憶體,這個值是由 memory_target 減去 sga_target 得到的。這些空閒記憶體可以用於 PGA 和 SGA ,並由 oracle 自動控制。
3) v$memory_dynamic_components 檢視顯示SGA 設定為 300M, 但是 PGA 設定為 724M ,這個大小是 memory_target 分配後的剩餘部分。這裡的 PGA 的值為 724M ,並不意味著 PGA 已經佔有了 724M ,也是意味著 PGA 可以佔有最大值為 724M 。
4) sga_target_size 預設值為 1G ,理論上這個就是 SGA 的最大值。
情況三
設定以下引數
- memory_target=1G
- sga_max_size=500m
- sga_target=300m
- pga_aggregate_target=100m
由於memory_max_target 沒有設定,所以它預設大小為 memory_target 。
SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';
NAME BYTES RES
-------------------------------- ---------- ---
Maximum SGA Size 521936896 No
Free SGA Memory Available 209715200
SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';
COMPONENT CURRENT_SIZE
---------------------------------------- ------------
SGA Target 314572800
PGA Target 759169024
總結:
1) 現在sga_target_size 設定為 500M , v$sgainfo 顯示 SGA 最大值為 500M
2) v$sgainfo 中顯示, SGA 可用值介於 sga_target 和 sga_max_size 之間
3) 超過sga_max_size ( 500M )的記憶體不會給 SGA 使用,所以不會顯示在 v$sgainfo 中
4) v$memory_dynamic_components 檢視中顯示SGA 設定為 300M , PGA 設定為 700M 。這個 700M 的值,是 memory_target 減去 sga_target 得到的。
---- end ----
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529886/viewspace-2715143/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE AMM 、ASMM 、自動記憶體管理(官方手冊)OracleASM記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- oracle 11g自動記憶體管理Oracle記憶體
- iOS記憶體管理詳解iOS記憶體
- 記憶體管理 記憶體管理概述記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- 【記憶體管理】記憶體佈局記憶體
- JVM學習-自動記憶體管理JVM記憶體
- JVM學習筆記——自動記憶體管理JVM筆記記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Go:記憶體管理與記憶體清理Go記憶體
- 【ORA-4030/4031】自動記憶體管理AMM中的ORA-4030/4031問題記憶體
- JVM自動記憶體管理機制 二JVM記憶體
- golang手動管理記憶體Golang記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- JavaScript 記憶體管理JavaScript記憶體
- iOS 記憶體管理iOS記憶體
- Android記憶體管理Android記憶體
- OC記憶體管理記憶體
- 記憶體管理-swMemoryGlobal記憶體
- Flink記憶體管理記憶體
- MySQL記憶體管理MySql記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Linux實體記憶體管理Linux記憶體
- iOS 記憶體管理MRCiOS記憶體
- “理解”iOS記憶體管理iOS記憶體
- iOS 記憶體管理研究iOS記憶體
- 01記憶體管理-概述記憶體
- python的記憶體管理Python記憶體
- 管理 Bitmap 記憶體(譯)記憶體
- C++記憶體管理C++記憶體
- CF的記憶體管理。記憶體
- Windows記憶體管理-分段Windows記憶體
- JavaScript的記憶體管理JavaScript記憶體
- HotSpot JVM 記憶體管理HotSpotJVM記憶體
- C語言之動態記憶體管理C語言記憶體
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露