SGA_MAX_SIZE
假设sga_max_size的大小设置为500M,os一般是不会在oracle启动的时候就给它全部的实际内存,而可能只给200M。随着程序的运行,Oracle不断的需要内存,而假设计算机的所有实际内存只有500M,那么很肯定的是OS不可能把全部500M实际内存分配给oraclesga,可能也最多就给了350M,剩下的150M使用虚拟内存。
假设我的机器物理内存(实际内存)足够多,如何让Oracle所申请的SGA内存全部在物理内存中呢,因为假设使用了虚拟内存,必定会带来额外的PAGE IN/PAGE OUTI/O操作,这是很不合算的。这个问题其实就是在物理内存中固定SGA的问题,这要涉及到另外两个参数LOCK_SGAPRE_PAGE_SGA以及具体操作系统是否支持内存锁定


SQL> select *  from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE  10.2.0.1.0  Production
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  TYPE  VALUE
------------------------------------ ----------- ------------------------------
lock_sga  boolean  FALSE
pre_page_sga  boolean  FALSE
sga_max_size  big integer 724M
sga_target  big integer 724M

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”的默认大小
 [root@dbmain ~]# ulimit -a
core file size  (blocks, -c) 0
data seg size  (kbytes, -d) unlimited
scheduling priority  (-e) 0
file size  (blocks, -f) unlimited
pending signals  (-i) 20479
max locked memory  (kbytes, -l) 32
max memory size  (kbytes, -m) unlimited
open files