the uga
包含与某个特定会话相关的信息,比如:
打开cursors持续及运行时的区域
包的状态信息,特别是包的变量
java会话状态
开启的角色
开启的任何trace事件
生效或运行中的nls参数
打开的任何数据库链接
基于可信任的oracle的会话的强制访问控制mac标签label
和pga一样,uga也包含两个组成区域,固定uga和可变uga,或者uga heap.固定uga包含70个原子变量,细小的数据结构,指向uga heap的指针.
uga heap的大块对于x$ksmup它的会话是可见的,它与x$ksmsp结构相同.uga heap包含一些固定表的固定内存,这与某些初始化参数有关,比如
open_cursors,open_links,max_enabled_roles.除非之外,uga heap大多数或主要地largely专门用于私有sql和pl/sql areas.
内存中uga的位置与会话的配置有关.在专有服务器连接中,一个会话与一个进程是固定的1:1关系,uga就位于pga之中.固定uga就是pga其中一个大块,
uga heap是pga的一个subheap.在mts和xa链接中,固定uga是共享池中的一个大块,uga heap是大池的一个subheap,or failing that,the shared pool(不会译).
在这种配置情况下(指mts or xa),uga位于sga中,这样就强迫每个用户的uga消耗一定量the amount的sga内存.多么精明的方法.可以用private_sga
profile resource limit来实现它.
the cga
和其它的全局区域不同,它是短暂的transient.仅仅只会存在于一个调用call期间.大多数对于实例的低级调用会用到它,这些调用包括:
解析一个sql语句
执行一个sql语句
提取一个select语句的输出结果
每个递归调用需要一个独立的cga.在语句解析期间也可能需要对于查询数据字典信息的递归调用,为了检查一个语句的语义,以及在语句优化期间
评估可选的执行计划.在执行pl/sql块时(为了处理每个sql语句子模块),也会用到递归调用,还有在dml语句执行过程中为了处理或进行或运行触发器的执行.
cga是pga一个subheap,而不管uga是否位于pga或者sga中.这个事实可以得一个重要的结论corollary,这些会话势必对应任何调用期间的一个进程.
特别是开发mts的应用时,理解这个很重要.如果一些调用会延伸protracted,必须增加进程数目,用来减轻compensate for that.
当然,调用calls不会在它们的cga中专用或排它使用数据结构.事实上与调用相关的一些重要的数据结构基本上typically在uga中.比如,私有sql和
pl/sql areas有排序区域必须位于uga,因为它们必须在多个调用期间持续存在.cga仅包含调用最后或结束时可以freed的数据结构.比如,cga包含直接i/o buffers,
递归调用的信息,表达式评估的stack空间,以及其它的临时数据结构.
java call memory也会在cga中进行分配.这块内存比其它任何的oracle内存区域管理更为集中.它被分割为三个空间,
the stack space,the new space,the old space.在the new space和old space中不再被引用的大块就是收集的垃圾garbage collected,在根据它们的持有或占有tenure
的长度和大小随之变化的频率,与之对应的调用执行期间.once一旦它们survived存在活一些new space的垃圾收集重复,new space chunks被拷贝到the old space.这是oracle
内存管理中唯一的垃圾收集方法.所有其它的oracle内存管理依赖于显式或明确的dead chunks的freeings.
process memory allocation
与sga不同,它在实例启动就固定了大小,当然pga可以增长.使用malloc()或sbrk()来扩展进程的heap data segment可以达到增长process memory的作用.新os的虚拟
内存然后以一个新extent被添加到pga heap上.这些extents通常大小仅仅是几k,如有必要oracle可能分配数以千计的extents.
但是,一个进程的heap data segment增长是有限制的.大多情况下,这个默认限制是由maxdsiz来控制.在一些情况下,这个默认值也可以根据不同的进程来改变.
这也是对于所有进程的总计虚拟内存大小会有一个全局的限制.这个限制与可用的swap space大小有关.如果超过任何一个限制,oracle相关进程会报ora-4030.
这个错误很少发生,因为每个进程的资源限制,通常表明swap space不足.为了诊断这个问题,可以用os工具查看swap space的使用情况.在一些os你也可以用另一个小工具maxmem
来检查每一个进程可以被分配最大的heap data segment大小值是多少,以及which limit is being hit first.
如果问题是swap space不足,如果paging 活动适度或者严重的话,此时你应尝试减少全局的虚拟内存使用,可以通过减少进程的数目或者减少每个进程的内存使用来达到这个目的.
否则,如果paging活动很轻微或为0时,你应增加swap space大小,最可取的是,如果你的os支持它,你应使用虚拟或pseudo
swap space.
os工具允许全系统范围内的虚拟内存超过space space,大约是未被锁定的物理内存数量.一些sa无理反对使用这种特征,
他们错误认为这样会导致内存paging.其实不是这样或其实不然.但是,它会极大减少在大内存系统上所需要swap space的数量.顺便说一句incidentally,swap space应该是物理内存的2倍以上,
我认为这个世所知之的公理不一定正确,但是一些系统确实不需要swap space.
process memory deallocation
oracle heaps增长比收缩更为容易或快速readily,但是与主流观点相反的是,它们可以也能收缩.v$mystat和v$sesstat的会话统计信息session uga memory和
session pga memory分别显示uga和pga heaps的当前大小,包括内部空闲空间.与之对应的统计信息session uga memory max和session pga memory max显示了会话生命周
期内每个heaps的峰值大小.
某些操作之后,uga和pga heaps才会进行收缩,比如一个disk sort的合并阶段,或者显式调用dbms_session.free_unused_user_memory过程free memory.但是,仅仅只有
完全空闲的heap extents会released给父heap或者给process data heap segment.甚至内存显式被freed,一些内部的空闲空间仍会remains.
虽然从技术方面可以这样作,在大多os下,oracle不会学试减少process data heap segment的大小及release虚拟内存给os.因此从os角度来讲,一个oracle进程的虚拟内存
大小会保持在它的hwm标准上.oracle依赖os来页出任何不用的虚拟内存(如有必要).因此,oracle进程所占用的虚拟内存大小的统计信息就会误导人.相反应使用内部的oracle统计信息,
甚至这些会夸大真实的内存需要.
在mts应用才会需要用dbms_session.free_unused_user_memory.应该谨慎使用它,仅仅只会把large package array variables使用的内存返回给large pool或共享池.
但是,内存首先应在uga heap中freed,这可以通过分配一个空队列empty array给队列变量,或者调用dbms_session.reset_package来达到目的.
请忽略dbms_session包上面的基于内存效果的说明之相关注解,它们仅用于一个用途或作用,曾经仅仅为了同一个目的或作用而重用(can only ever be reused for the same purpose).
经历了一个large sort之后,有必要free unused user memory.what is intended is that memory所针对这部分内存,一旦分配给了一个subheap,通常情况下只在那个that subheap中可用,
直至整个subheap被freed.但是,许多subheaps,比如cga,freed过于快速致使语句至多产生了误解(such as the cga,are freed so quicky that the statement is,at best misleading)
而且(此外)moreover,在一个sort后正常情况没必要free unused user memory,not even甚至不是在mts应用中,因为大多数排序内存,实际上,自动进行freed.
taking headdumps
oracle支持提取heapdumps信息,为了便于诊断一个潜在的内存问题.在当前进程中使用alter session set event可以提取heapdumps信息,或者在另一个会话用oradebug event.
heapdumps信息会写入进程的dump目录结构的一个trace file中,它包含x$表的大量对应信息.
primary heaps的heapdumps的事件语法是immediate trace name heapdump level n.级别(n)是一个bit模式,代表要dump哪个heaps:1对应pga,2对应sga,4对应uga,8对应cga,32对应
large pool.
arbitrary subheaps任意的subheaps的heapdumps的事件语法是immediate trace name heapdump_addr level n,这里n是heap descriptor描述符的十六进制地址所对应的十进制.
ksm x$表的ksmchpar列可以查看subheap heap descriptor addresss,以及在它们parent heaps的heapdumps旁边上的ds=string
reference参考
这节包含参数,事件,统计的一些快速指志信息
parameters参数
参数 描述
_large_pool_min_alloc 大池大块分配会四舍五入到这个值.默认是16k,不应被改变
_use_ism intimate亲密共享内存默认被使用.但是,在一些os下实行这个是有问题的,因此有时有必要设置它为false
db_files log_files(oracle8.1之前)control_files 它们影响固定pga的大小.它们的大小不应大于任何必要的配置(they should not be any larger than reasonably necessary)
large_pools_size 满足大池的一些large chunks of memory的必然需要certain demands.
lock_sga 如果os一直存在paging,应配置它为true,防止sga paging.
log_buffer 虽然它是sga一个独立区域,但从大小上讲它是微不足道的
open_cursors open_links max_enabled_roles 影响固定uga大小.它们的大小不要超过必要的大小
pre_page_sga 设置为true,会导致所有的oracle服务器进程,在进程启动时,必要时分page in整个sga.这样会在实际启动之后哪个期间马上产生一个小小或微小marginal的性能提升,但这样同时会带来所有进程启动变慢的风险.
sessions 它会对共享池的固定内存chunk的固定表的总计大小产生最大的影响
shared_memory_address hi_shared_memory_address 在一些os上,用它们指定sga应被附加attached在虚拟内存地址哪个区哉
shared_pool_reserved_size 从共享池reserved list中选出满足大于5000bytes的共享池chunk分配大小allocations.这个参数设置reserved lists的大小(以bytes计).reserved list分配的门限值,由_shared_pool_reserved_min_alloc决定,不应被改变.
shared_pool_size 设定用于动态分配的共享池的大约的大小,以bytes表示
sort_area_size 此参数对内存使用与性能有很大影响
events事件
事件 描述
4030 这是进程内存错误事件的输出out.为了提取发生匹配此精时间发生错误的pga,uga,cga,在你的参数文件设置如下
event="4030 trace name heapdump level 13"
4031 这是共享内存错误事件的输出.如果你发现系统一直重复报ora-04031错误,可以在参数文件中设置如下事件以提取精确时间发生这个错误的sga heapdump信息
event="4031 trace name heapdump level 2"
在mts环境中,为了包含一个uga heapdump,要采用level 6
10235 这个事件让oracle server code不断检查内存完整性和heap管理数据结构.为了诊断一些可疑的内存损坏问题,有时这样很有必要.但不幸的是,这个事件只适用下实例范围,不能在单个进程上设置
statistics统计
统计 出处或源头 描述
free memory v$sgastat sga heap的空闲内存.它包含固定内存chunk上面空闲列表和备用空闲内存的大块,但不包含unpinned 重建大块
session uga memory v$sesstat and v$mystat 会话uga heap的当前大小,不含固定uga
session uga memory max v$mystat and v$sesstat uga heap大小的hwm
session pga memory v$mystat and v$sesstat 会话pga heap的当前大小,不含固定pga
session pga memory max v$mystat and v$sesstat pga heap大小的hwm
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-662456/
,如需转载,请注明出处,否则将追究法律责任。