SGA 中包含了多个内存组件(component),每一组件都可以被看作为一个内存池,用于满足特定类型的内存分配请求。举例来说,内存组件中包括共享池(shared
pool)(为 SQL 及 PL/SQL 的执行分配内存),Java 池(java pool)(为 Java 对象及 Java
程序的执行分配内存),及数据缓存区(buffer cache)(用于缓存磁盘上的数据块)等。所有 SGA
组件都是以预设的粒度(granule)为单位进行内存的分配与回收的。Oracle 数据库通过记录每个 SGA 组件使用的粒度单位的数量来掌握整个
SGA 的内存使用情况。
粒度单位的大小是由整个 SGA 的容量决定的。在大多数平台下,当 SGA 的容量小于 1GB 时,一个粒度单位为 4MB;当 SGA
的容量大于 1GB 时,一个粒度单位则为 16MB。但也有些平台例外。例如,在 32 位的 Windows 平台下,当 SGA 的容量大于
1GB 时,一个粒度单位为 8MB。
用户可以设定 Oracle 数据库实例的 SGA 能够使用的内存总数量。Oracle
在启动一个实例之初只会为此实例分配最小所需内存,而在实例运行期间可以通过扩展各个 SGA 组件来为实例提供更多内存,SGA 所使用内存的上限由
SGA_MAX_SIZE 初始化参数决定。在实例初始化时,如果初始化参数文件(initialization parameter
file)或服务器参数文件(server parameter file)中
SGA_MAX_SIZE 的值小于 Oracle 为 SGA 各组件分配的内存之和(为 SGA
各组件分配的内存数量是依据参数文件中的显式设定值或系统的默认值),Oracle 将忽略
SGA_MAX_SIZE 参数。
为了优化系统性能,整个 SGA 的容量应与实际内存数量相符。如果因 SGA 过大而需要使用虚拟内存(virtual
memory)时,数据库的系统性能将显著下降。因为此时操作系统需要对 SGA 中的部分内容进行分页(page)(即在磁盘上进行读写操作)。SGA
中各个内存组件的容量会对数据库系统的性能有所影响。
阅读(2378) | 评论(0) | 转发(0) |