内存管理
2013-10-11 22:53
190 查看
Oracle 实例中的内存使用分为两类:
1. 程序全局区(Program Global Area, PGA)
专门供每个会话使用,从 9i 版本开始,PGA 的管理实现自动化。
2. 系统全局区(System Global Area, SGA)
由所有 Oracle 进程共享,从 10g 版本开始,SGA 的管理实现自动化。
11g 版本可以同时管理 PGA 和 SGA
PGA 内存管理
在执行 SQL 语句时,服务器进程使用 PGA 来存储会话特有的数据,包括:
临时表
排序行
合并位图
变量
调用堆栈
每个 SQL 语句都使用 SGA 中的内存(共享池中的共享 SQL 区域),并需要最低限度的 PGA 内存(专用 SQL 区域),否则 SQL 语句将无法执行。
使用两个实例参数来启用自动 PGA 内存管理:
WORKAREA_SIZE_POLICY
PGA_AGGREGATE_TARGET
WORKAREA_SIZE_POLICY 的默认值是 AUTO,这意味着 Oracle 可以根据需要,将 PGA 分配给会话,同时力求将 PGA 分配总量保持在 PGA_AGGREGATE_TARGET 范围内。
PGA_AGGREGATE_TARGET 的默认值是大于 10 MB,或是 SGA 大小的 20%,应对其执行向上调整。
SGA 内存管理
SGA 包含多个内存结构,这些结构的大小可以独立地调整,如下所示:
共享池 (Shared Pool)
数据库缓冲区缓存 (Buffer Cache)
大池 (Large Pool)
流池 (Streams Pool)
Java 池 (Java Pool)
日志缓冲区 (Log Buffer)
分配给大池、Java 池和流池的内存不可转让 -- 只是需要或不需要这样的内存。如果这些结构不够大,那么将发生错误;如果这些结构过大,就不会提高性能。
分配给共享池、数据库缓冲区缓存和日志缓冲区的内存是可转让的:如果达不到最优大小,那么不会发生错误,但性能会因此下降。共享池是一个例外:如果在较长时间内达不到最优大小,那么将会发生错误。
SGA 内存管理可以自动进行,但日志缓冲区例外。日志缓冲区是一个 SGA 组件,其大小在启动实例时固定下来,无法进行自动管理。
手动管理 SGA 的参数如下:
SHARED_POOL_SIZE
DB_CACHE_SIZE
LARGE_POOL_SIZE
STREAMS_POOL_SIZE
JAVA_POOL_SIZE
要启用 SGA 自动管理,则保留使用所有这些参数的默认值(或将其设置为 0),并设置一个参数来启用自动共享内存管理(Automatic Shared Memory Management, ASSM):
SGA_TARGET
在使用 ASSM 时,实例将监视各个 SGA 组件的内存需求,并根据需要将内存分配给组件,如有必要,就会减少内存容量,以便将内存分配总量控制在目标范围内。包含在目标范围的还有日志缓冲区,其大小使用静态的 LOG_BUFFER 参数进行设置:在启动实例时创建日志缓冲区,其大小以后不能再调整。
LOG_BUFFER 的默认值可能是正确的。可以将此参数设置的比默认值更大,但这往往会导致性能下降。如果将其设置的低于默认值,那么将忽略相应的设置。
如果设置了任何控制自动管理的 SGA 组件参数,那么给定的值将作为最小大小(ASSM 不会使组件的内存低于此值)。
自动内存管理
使用自动内存管理(Automatic Memory Management)机制时,通过设置 MEMORY_TARGET 这个参数,就可以让 Oracle 实例从总体上管理服务器内存的使用。这允许 Oracle 根据需要在 PGA 和 SGA 之间转换内存,从而将自动 PGA 管理和自动共享内存管理又向前推了一步。
要启用自动内存管理,设置一个参数 MEMORY_TARGET 参数即可。
MEMORY_TARGET 参数是动态的,可以在不关闭实例的情况下对其进行调整,但其调整不能超过另一个参数 MEMORY_MAX_TARGET 设置的限制。
MEMORY_MAX_TARGET 参数是静态的,要将其调整得更大,只能通过 SCOPE=SPFILE 子句进行调整然后重新启动实例。
如果在启用 AMM 的情况下设置了参数 PGA_AGGREGATE_TARGET 或 SGA_TARGET,那么指定的值将是最小值(AMM 不会使 PGA 或 SGA 低于此值)。
设置内存管理参数
本练习中,将禁用 AMM(如果已启用),并分别设置 SGA 和 PGA 目标。
1. 使用 SQL*Plus,作为用户 SYSTEM 连接数据库。
2. 确保未设置任何用于手工管理动态 SGA 内存结构的参数:
3. 禁用 AMM
4. 分别使用参数来确定 PGA 和 SGA 的大小,使用允许的最小值:
第二条命令需要等待几分钟完成,如果 Oracle 无法将 SGA 降低到请求的值,则命令将失败。
5. 通过将所有会话的 session pga memory 统计信息值相加,确定当前分配的 PGA 的实际大小:
此数字远超步骤 4 中要求的 10 MB。其原因在于 10 MB 值过小,Oracle 无法遵循此值。PGA 目标只是目标,并非硬性限制。
6. 确定 SGA 的实际大小
此数字同样可能大于步骤 4 中要求的值。
1. 程序全局区(Program Global Area, PGA)
专门供每个会话使用,从 9i 版本开始,PGA 的管理实现自动化。
2. 系统全局区(System Global Area, SGA)
由所有 Oracle 进程共享,从 10g 版本开始,SGA 的管理实现自动化。
11g 版本可以同时管理 PGA 和 SGA
PGA 内存管理
在执行 SQL 语句时,服务器进程使用 PGA 来存储会话特有的数据,包括:
临时表
排序行
合并位图
变量
调用堆栈
每个 SQL 语句都使用 SGA 中的内存(共享池中的共享 SQL 区域),并需要最低限度的 PGA 内存(专用 SQL 区域),否则 SQL 语句将无法执行。
使用两个实例参数来启用自动 PGA 内存管理:
WORKAREA_SIZE_POLICY
PGA_AGGREGATE_TARGET
WORKAREA_SIZE_POLICY 的默认值是 AUTO,这意味着 Oracle 可以根据需要,将 PGA 分配给会话,同时力求将 PGA 分配总量保持在 PGA_AGGREGATE_TARGET 范围内。
PGA_AGGREGATE_TARGET 的默认值是大于 10 MB,或是 SGA 大小的 20%,应对其执行向上调整。
SGA 内存管理
SGA 包含多个内存结构,这些结构的大小可以独立地调整,如下所示:
共享池 (Shared Pool)
数据库缓冲区缓存 (Buffer Cache)
大池 (Large Pool)
流池 (Streams Pool)
Java 池 (Java Pool)
日志缓冲区 (Log Buffer)
分配给大池、Java 池和流池的内存不可转让 -- 只是需要或不需要这样的内存。如果这些结构不够大,那么将发生错误;如果这些结构过大,就不会提高性能。
分配给共享池、数据库缓冲区缓存和日志缓冲区的内存是可转让的:如果达不到最优大小,那么不会发生错误,但性能会因此下降。共享池是一个例外:如果在较长时间内达不到最优大小,那么将会发生错误。
SGA 内存管理可以自动进行,但日志缓冲区例外。日志缓冲区是一个 SGA 组件,其大小在启动实例时固定下来,无法进行自动管理。
手动管理 SGA 的参数如下:
SHARED_POOL_SIZE
DB_CACHE_SIZE
LARGE_POOL_SIZE
STREAMS_POOL_SIZE
JAVA_POOL_SIZE
要启用 SGA 自动管理,则保留使用所有这些参数的默认值(或将其设置为 0),并设置一个参数来启用自动共享内存管理(Automatic Shared Memory Management, ASSM):
SGA_TARGET
在使用 ASSM 时,实例将监视各个 SGA 组件的内存需求,并根据需要将内存分配给组件,如有必要,就会减少内存容量,以便将内存分配总量控制在目标范围内。包含在目标范围的还有日志缓冲区,其大小使用静态的 LOG_BUFFER 参数进行设置:在启动实例时创建日志缓冲区,其大小以后不能再调整。
LOG_BUFFER 的默认值可能是正确的。可以将此参数设置的比默认值更大,但这往往会导致性能下降。如果将其设置的低于默认值,那么将忽略相应的设置。
如果设置了任何控制自动管理的 SGA 组件参数,那么给定的值将作为最小大小(ASSM 不会使组件的内存低于此值)。
自动内存管理
使用自动内存管理(Automatic Memory Management)机制时,通过设置 MEMORY_TARGET 这个参数,就可以让 Oracle 实例从总体上管理服务器内存的使用。这允许 Oracle 根据需要在 PGA 和 SGA 之间转换内存,从而将自动 PGA 管理和自动共享内存管理又向前推了一步。
要启用自动内存管理,设置一个参数 MEMORY_TARGET 参数即可。
MEMORY_TARGET 参数是动态的,可以在不关闭实例的情况下对其进行调整,但其调整不能超过另一个参数 MEMORY_MAX_TARGET 设置的限制。
MEMORY_MAX_TARGET 参数是静态的,要将其调整得更大,只能通过 SCOPE=SPFILE 子句进行调整然后重新启动实例。
如果在启用 AMM 的情况下设置了参数 PGA_AGGREGATE_TARGET 或 SGA_TARGET,那么指定的值将是最小值(AMM 不会使 PGA 或 SGA 低于此值)。
设置内存管理参数
本练习中,将禁用 AMM(如果已启用),并分别设置 SGA 和 PGA 目标。
1. 使用 SQL*Plus,作为用户 SYSTEM 连接数据库。
2. 确保未设置任何用于手工管理动态 SGA 内存结构的参数:
SQL> alter system set shared_pool_size=0 scope=memory; System altered. SQL> alter system set db_cache_size=0 scope=memory; System altered. SQL> alter system set large_pool_size=0 scope=memory; System altered. SQL> alter system set java_pool_size=0 scope=memory; System altered.
3. 禁用 AMM
SQL> alter system set memory_target=0 scope=memory; System altered.
4. 分别使用参数来确定 PGA 和 SGA 的大小,使用允许的最小值:
SQL> alter system set pga_aggregate_target=10m scope=memory; System altered. SQL> alter system set sga_target=256m scope=memory; System altered.
第二条命令需要等待几分钟完成,如果 Oracle 无法将 SGA 降低到请求的值,则命令将失败。
5. 通过将所有会话的 session pga memory 统计信息值相加,确定当前分配的 PGA 的实际大小:
SQL> select sum(value) from v$sesstat natural join v$statname 2 where name='session pga memory'; SUM(VALUE) ---------- 103937704
此数字远超步骤 4 中要求的 10 MB。其原因在于 10 MB 值过小,Oracle 无法遵循此值。PGA 目标只是目标,并非硬性限制。
6. 确定 SGA 的实际大小
SQL> select sum(bytes) from v$sgastat; SUM(BYTES) ---------- 265618304
此数字同样可能大于步骤 4 中要求的值。
相关文章推荐
- 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
- NSString的内存管理问题 (转载)
- 关于linux内存管理
- 【内存管理】STL空间配置器
- OC学习笔记七---内存管理一
- JVM——Java内存管理及GC机制
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- 「OC」内存管理
- c/c++内存管理
- iPhone开发内存管理
- Linux内存管理之slab机制(初始化)
- swit3.1 (9)笔记 内存管理和方法
- JVM内存管理:深入Java内存区域与OOM
- iOS Block的内存管理
- Oracle内存管理(之五)
- objective-c内存管理一点总结
- 《iOS高级内存管理编程指南》学习笔记
- c——内存管理
- linux内存管理之三——slab分配器
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别