oracle内存管理

内存存储的主要内容:
        程序代码;
        已经连接的会话信息,包括当前所有活动和非活动会话;
        程序运行时必须的相关信息
        oracle进程之间共享的信息和相互交流的信息
        永久存储在外围存储介质上,被cache在内存中的数据

SGA
      是一组为系统分配的共享的内存结构。

包括以下数据结构:
        数据缓冲(Buffer Cache)
        重做日志缓冲(Redo Log Buffer)
        共享池(Shared Pool)
        java池(Java Pool)
        大池(Large Pool)
        流池(Streams Pool)10g以后才有
        数据字典缓存(Data Dictionary Cache)
        其他信息
SQL> show sga

Total System Global Area 2147483648 bytes
Fixed Size                       2085360 bytes
Variable Size                    1241517584 bytes
Database Buffers              889192448 bytes
Redo Buffers                   14688256 bytes
        
数据字典缓存和其他信息会被实例的后台进程所访问,它们在实例启动后就固定在SGA中了,而且不会改变,所有这部分又称为固定SGA(Fixed SGA)。这部分区域的大小一般小于100K。

Shared Pool,Java Pool,Large Pool和Streams Pool这几块内存区的大小是相应系统参数设置而改变的,所以可以统称为可变SGA(Variable SGA)。

SQL> show parameter sga

NAME                                 TYPE            VALUE
------------------------------------ --------------- ------------------------------
lock_sga                             boolean         FALSE
pre_page_sga                         boolean         FALSE
sga_max_size                         big integer     2G
sga_target                           big integer     2G

SQL> select NAME,VALUE,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where NAME like 'sga%';

NAME                 VALUE                ISSES_MODIFIABL ISSYS_MODIFIABLE
-------------------- -------------------- --------------- --------------------
sga_max_size         2147483648           FALSE           FALSE
sga_target           2147483648           FALSE           IMMEDIATE
如果ISSYS_MODIFIABLE返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库。
所以sga_max_size是不可以动态修改的。

相关参数说明
sga_max_size
          控制SGA使用虚拟内存的最大大小
          当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的综合大小受到了sga_max_size的限制。如果在设置参数时,指定区域为spfile时,是不会受到这个限制的。

pre_page_sga
          如果为true,实例一启动后,所有SGA都分配到物理内存。

lock_sga
          为true时,可将全部SGA都锁定在物理内存中。

sga_target
          10g之前,SGA的各个内存区在分配之后,只能给本区使用,相互之间是不能共享的。10g的新特性,自动共享内存管理(Automatic Shared Memory Management ASMM)。 控制这一特性的,就是sga_target。一旦给sga_target指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。启动后,sga中各个内存的大小由oracle自行控制,不需要人为指定。这样就能使sga的利用率达到最佳,从而节省内存成本。sga_target的大小不能超过sga_max_size。当sga_target小于sga_max_size时,实例启动后,sga_max_size就自动变为和sga_target一样的值了。
          以下sga内存区由ASMM来自动调整:共享池,java池,大池,数据缓存区,流池。
          10g开始,虽然修改sga后,还是需要重启实例才能生效,但是有了sga_target之后,可以将sga_max_size设置偏大,再根据实际需要调成sga_target的值。

Database Buffer Cache
          保存最近从数据文件中读取的数据块。数据高速缓存块由许多大小相等的缓存块组成。
         这些缓存块分为三类:
        脏缓存块:保存已经修改过的缓存块。
        空闲缓存块:没有数据,等待被写入数据。
        命中缓存块(pinned ):保存最近正在被访问的缓存块。

通过两个列表来管理缓存块:
    DIRTY列表保存已经被修改单还没有写入数据文件的脏缓存块。
    LRU(least recently used)链表保存所有空闲缓存块,命中缓存块以及还没有被列入DIRTY列表的脏缓存块。LRU链表的两端分别叫做最近使用端(the most recently  used MRU)和最近最少使用端(LRU)。

工作过程:
     当一个oracle进程访问一个缓存时,会将这块缓存移到LRU链表中的MRU。而当越来越多的缓冲块被移到MRU端,那些已经过时的脏缓冲(即数据改动已经写入数据文件中,此时缓冲中的数据和数据文件中的数据已经一致)则被移到LRU链表中的LRU端。
    当一个oracle进程第一次访问一个数据块时,会先朝着buffer cache中是否存在这个数据块的拷贝。如果发现这个数据块已经存在于buffer cache(即命中cache hit),他就会直接读从内存中取出该数据块。如果在buffer cache中没有发现该数据块(即未命中cache miss),它就需要先从数据文件中读取该数据块到buffer cache中,然后才访问该数据块。命中次数与进程读取次数之比就是衡量一个数据库性能的重要好指标:buffer hit ratio。
    如果未命中,则需要先将数据块读取到缓存中去。这是oracle进程需要从空闲列表中找到一个适合大小的空闲缓存。如果空闲里诶包中可没有适合大小的空闲buffer,它就会从LRU端开始查找LRU链表,知道找到一个可重用的缓存块或者达到最大查找块数限制。在查找过程中,如果进程会找到一个脏缓存块,它将这个缓存块移到脏链表中,然后继续查找。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24989466/viewspace-1332945/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24989466/viewspace-1332945/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值