SGA:
buffer cache:
default pool; DB_CACHE_SIZE
keep pool; DB_KEEP_CACHE_SIZE 常驻内存
non standard pool: DB_nK_CACHE_SIZE
recycle pool. db_recycle_size
share pool:
library cache; 库缓存
row cache; 行缓存
java pool; java_pool_size
large pool; large_pool_size
fixed sga. 固定的SGA区域,包含了Oracle内部的数据结构。
PGA--(初始化参数 pga_aggregate_target)
| |__ sort_area_size
| |__ bitmap_merge_area_size
| |__ hash_area_size
| |__ open_cursors
| |__ oracle 堆栈和TNS堆栈
pre_page_sga
oracle实例启动时,会只载入各个内存区最小的大小。 当pre_page_sga=true。实例启动时,全部加在进入内存
LOCK_SGA
保证SGA都被锁定在物理内存中。
自动内存管理ASMM
设置sga_target,并且statistical_level设置为typical或者all则将启动ASMM。
自动调整的内存池:
| |__shared pool
| |__buffer cache
| |__java pool
| |__large pool
| |__streams pool
手动调整的内存池
| |__db_keep_cache_pool
| |__log buffer
| |__db_nk_cache_pool
| |__db_recycle_pool
keep的使用:
alter system set db_keep_cache_size=10M
alter table emp storary(buffer_pool keep);
ASMM:
ASMM内存交换模型存在三类组件:
| |__可调优组件(tunable)可调优组件是那些大小可以随之变化且若过小仅损害少量性能。buffer cache就是一个经典的例子,cache过小的情况下应用程序仍能正常运行,但带来的代价是更多的 IO。注意可调优组件同时存在一个下限。举例来说共享池由库缓存Library cache和其他一些 subheap子堆组成,那么共享池就存在一个下限要保证至少能放下某个一个时刻并行打开的游标(open cursors)以及负担其他共享池client的运行时内存分配需求。类似的buffer cache也存在一个下限,该下限至少要大于并行被pin住的buffer的总和(虽然这部分很小)
| |__不可调组件(Un-tunable):不可调组件是那些存在最小下限的内存组件,这个最小下限足够让应用程序正常运行,超过这个上限并不会带来额外的性能收益。在这类组件中large pool是一个典型。
| |__固定大小组件(Fixed Size):自动调优框架之外的组件,一般为固定大小。这些组件的大小仅在手动调整时改变。例如非标准块大小的高速缓冲池
ASMM内存交换模型三种模式:
| |__立即内存申请(Immediate Request):这种申请模式一般出现在ASMM管理的某个自动调优组件在无法分配到连
续可用内存块(chunk)时,为了避免出现OUT-OF-MEMORY(ORA-04031)的错误,系统尝试从其他候选组件中转移一个内存颗粒(granule)过来。需要注意的是当前可能没有可用的全空granule,这时就会出现不完整的转移,在此情形下系统会开始从候选组件中清理内存颗粒以满足内存申请,并将一个granule不完整地转移给急需内存的组件。
| |__延迟内存申请(Deferred Request):这种申请一般出现在系统认为存在一种更为合理的内存分配时,考虑在组件
之间转移一个或多个granule。用以判定最佳内存分配的依据是MMON进程所提供的统计信息delta.
| |__手动内存申请(Manual Request):这种申请仅发生在用户使用alter system命令手动调整内存组件的大小时。在这种模式下仅允许使用空的内存颗粒参与大小调整。如果当时没有足够的空granule,那么针对组件grow操作会返回ORA-4033错误,而针对组件shrink操作会返回ORA-4034错误。