假設sga_max_size的大小設置爲500M,os一般是不會在oracle啓動的時候就給它全部的實際內存,而可能只給200M。隨着程序的運行,Oracle不斷的需要內存,而假設計算機的所有實際內存只有500M,那麼很肯定的是OS不可能把全部500M實際內存分配給oracle的sga,可能也最多就給了350M,剩下的150M使用虛擬內存。
假設我的機器物理內存(實際內存)足夠多,如何讓Oracle所申請的SGA內存全部在物理內存中呢,因爲假設使用了虛擬內存,必定會帶來額外的PAGE IN/PAGE OUT的I/O操作,這是很不合算的。這個問題其實就是在物理內存中固定SGA的問題,這要涉及到另外兩個參數LOCK_SGA和PRE_PAGE_SGA以及具體操作系統是否支持內存鎖定。
SQL> select *
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
1.查看lock_sga和pre_page_sga參數的默認值
SQL> show parameter sga
NAME
------------------------------------ ----------- ------------------------------
lock_sga
pre_page_sga
sga_max_size
sga_target
2、修改lock_sga和pre_page_sga參數
alter system set lock_sga=true scope=spfile;
alter system set pre_page_sga=true scope=spfile;
3、關閉數據庫時再重啓數據庫出現以下錯誤
startup;
ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory
原因很簡單,Linux操作系統對每一個任務在物理內存中能夠鎖住的最大值做了限制!需要手工進行調整。
4、“ORA-27102”及“Cannot allocate memory”問題處理
1)使用“ulimit -a”命令獲得“max locked memory”的默認大小
core file size
data seg size
scheduling priority
file size
pending signals
max locked memory
max memory size
open files