Auto Memory Management是Oracleg提出来的一个新特性在最新的Oracleg数据库中又得到了进一步的发展通过使用自动内存管理Oracle数据库中的PGA和SGA内存之间可以互相转换根据当前的工作负载来自动设定Oracle内存区域中的PGA和SGA的大小这种间接的内存转换依赖于操作系统的共享内存的释放机制来获得内部实例的调优目前这种技术可以应用于Linux Solaris HPUX AIX 和Windows等操作系统上
首先我们来回顾下Oracleg的自动内存管理特性在Oracleg的数据库中只有SHARED_POOL_SIZEDB_CACHE_SIZELARGE_POOL_SIZEJAVA_POOL_SIZESTREAMS_POOL_SIZE五个SGA组件可以被自动调整其中PGA的最大值由初始化参数PGA_AGGREGATE_TARGET决定SGA的最大值由初始化参数SGA_TARGET决定
在Oracleg数据库中使用自动内存管理特性不再需要设定参数PGA_AGGREGATE_TARGET和SGA_TARGET因为这两个参数都已经被修改成自动调优的除非想指定PGA和SGA的最小值才需要设定这两个参数在Oracleg数据库中则需要设置一个叫做MEMORY_TARGET的初始化参数这个参数是指整个Oracle实例所能使用的内存大小包括PGA和SGA的整体大小在MEMORY_TARGET的内存大小之内PGA和SGA所用的内存可以根据当前负载情况自动相互转换如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候Oracleg还提供了另外一个初始化参数MEMORY_MAX_TARGET当原始设定的内存不够使用的时候可以手工来动态 调节MEMORY_TARGET的大小但是不允许超过MEMORY_MAX_TARGET的值下面这张图简单明了的描述出了Oracleg数据库内存大小的设定参数
此外Oracleg数据库还提供了几个用于监控自动内存管理的视图
V$MEMORY_DYNAMIC_COMPONENTS描述当前所有内存组件的状态
V$MEMORY_RESIZE_OPS循环记录最后次的SGA大小调整请求
X$KMGSTFR:循环记录最后次的SGA的转换地址
_MEMORY_MANAGEMENT_TRACING=:对于所有的内存转换调整行为均记录保存为跟蹤文件