您的位置:首页 > 数据库 > Oracle

Oracle内存全面分析(12)- Dump内存解析

2014-11-14 12:02 387 查看

Oracle内存全面分析(12)

4.Dump内存解析

下面以sharedpool为例,解释一下dump出来的内存结构。

SQL>connsys/sysassysdba

Connected.

SQL>oradebugsetmypid

Statementprocessed.

SQL>oradebugdumpheapdump2

Statementprocessed.

SQL>


以下时trace文件的内容,我们分别解释各个部分:

Dumpfilec:\oracle\product\10.2.0\admin\fuyuncat\udump\fuyuncat_ora_4032.trc

TueJul1116:03:262006

ORACLEV10.2.0.1.0-Productionvsnsta=0

vsnsql=14vsnxtr=3

OracleDatabase10gEnterpriseEditionRelease10.2.0.1.0-Production

WiththePartitioning,OLAPandDataMiningoptions

WindowsXPVersionV5.1ServicePack2

CPU:2-type586

ProcessAffinity:0x00000000

Memory(Avail/Total):Ph:885M/2039M,Ph+PgF:2702M/3890M,VA:1590M/2047M

Instancename:fuyuncat


Redothreadmountedbythisinstance:1


Oracleprocessnumber:18


Windowsthreadid:4032,image:ORACLE.EXE(SHAD)



***SERVICENAME:(SYS$USERS)2006-07-1116:03:26.322

***SESSIONID:(159.7)2006-07-1116:03:26.322

这部分是关于trace文件的基本信息,oracle版本、资源情况、用户和会话等。

KGHLatchDirectoryInformation

ldirstate:2nextslot:75

Slot[1]Latch:03C3D280Index:1Flags:3State:2next:00000000

Slot[2]Latch:1EC9D4B0Index:1Flags:3State:2next:00000000

Slot[3]Latch:1EC9D540Index:1Flags:3State:2next:00000000

Slot[4]Latch:03C3E100Index:1Flags:3State:2next:00000001

Slot[5]Latch:1ED65CE4Index:1Flags:3State:2next:00000000

Slot[6]Latch:1ED65F14Index:1Flags:3State:2next:00000000

......

这部分记录的是sharedpool中的latch信息。每个latch的具体信息可以通过视图V$LATCH、V$LATCH_PARENT、V$LATCH_CHILDREN或者表x$ksllt查出

******************************************************

HEAPDUMPheapname="sgaheap"desc=03C38510

extentsz=0x32c8alt=108het=32767rec=9flg=-126opc=0

parent=00000000owner=00000000nex=00000000xsz=0x10

******************************************************

这是堆dump信息的头部,heapname说明了内存所述的堆,sharedpool是属于SGA区的,因此,这里是"sgaheap";

extentsz记录的是所有扩展段的大小。

HEAPDUMPheapname="sgaheap(1,0)"desc=04EC131C

extentsz=0xfc4alt=108het=32767rec=9flg=-126opc=0

parent=00000000owner=00000000nex=00000000xsz=0x400000

EXTENT0addr=1CC00000

Chunk1cc00038sz=24R-freeable"reservedstoppe"

Chunk1cc00050sz=212888R-free""

Chunk1cc33fe8sz=24R-freeable"reservedstoppe"

Chunk1cc34000sz=3977544perm"perm"alo=3977544

Chunk1cfff148sz=3768free""

EXTENT1addr=1D000000

Chunk1d000038sz=24R-freeable"reservedstoppe"

Chunk1d000050sz=212888R-free""

Chunk1d033fe8sz=24R-freeable"reservedstoppe"

Chunk1d034000sz=2097168perm"perm"alo=2097168

这部分信息是trace文件中的主要部分,它详细记录了sharedpool中各个chunk的信息。

首先看它的头部信息,注意到这里heapname是"sgaheap(1,0)"。这是什么意思呢?我们前面提到,oracle10g会将sharedpool分为几个区来管理,这里就是其中的一个区。共有4个区。通过表X$KGHLU可以看到对应的LRU链表。

EXTENT0addr=1CC00000

这一行说明下面的chunk都属于这个扩展段(extent),0是它的编号,addr是它的起始地址。

Chunk1cc00038sz=24R-freeable"reservedstoppe"

这是一个chunk的信息,sz是这个chunk的大小(24字节)。R-freeable是这个chunk的状态,"reservedstoppe"是这个chunk的用途。Chunk有4种可能状态,以下是这四种状态的含义:

free:即空闲chunk,可以随时分配给适合大小的请求;

freeable:这种状态的chunk表示它当前正在被使用,但是这种使用是短期的,比如在一次调用中或者一个会话中,会话或者调用解释就可以被释放出来。这种状态的chunk是不放在LRU链表中的,一旦使用结束,自动成为free状态,放到空闲列表中;

recreatable:这种状态的chunk正在被使用,但是它所包含的对象是可以被暂时移走、重建,比如解析过的语句。它是被LRU链表管理的。

permanent:顾名思义,这种状态的chunk所包含的对象是永远不会被释放的。即使flushsharedpool也不会释放。

我们注意到,这里还有一些状态是有前缀“R-”的。带有这种前缀的chunk说明是sharedpool中的保留区的chunk。

Totalheapsize=41942480

最后是这一sharedpool区的总的大小。

FREELISTS:

Bucket0size=16

Bucket1size=20

Chunk166ed050sz=20free""

Chunk167de068sz=20free""

Chunk164b9c10sz=20free""

Chunk1f2776f8sz=20free""

接下来便是这个sharedpool区的空闲列表。Bucket是一个空闲列表的范围,例如Bucket1,它的最小值是上一个Bucket的最大值,即16,最大值为20。Bucket下面是空闲列表中chunk,后面的信息和前面解释chunk的信息一样,8位的16进制数字是它的地址;sz是chunk的大小;free是chunk的状态,因为是空闲列表中的chunk,这里只有一个状态;最后是chunk的用途(即指X$KSMSP中的KSMCHCOM字段值,如其值可以为sessionparam、multiblock
read、librarycache、sqlarea、PL/SQLMPCODE、KGLhandles、dictionarycache、freememory、rowcachelru、permanentmemory等,或是librarycacheobject的类型??)
,因为都是free,所以肯定为空。

Totalfreespace=1787936

最后是这块sharedpool区中空闲chunk的总的大小。

RESERVEDFREELISTS:

Reservedbucket0size=16

Reservedbucket1size=4400

Reservedbucket2size=8204

Reservedbucket3size=8460

Reservedbucket4size=8464

Reservedbucket5size=8468

Reservedbucket6size=8472

Reservedbucket7size=9296

Reservedbucket8size=9300

Reservedbucket9size=12320

Reservedbucket10size=12324

Reservedbucket11size=16396

Reservedbucket12size=32780

Reservedbucket13size=65548

Chunk1b800050sz=212888R-free""

Chunk16c00050sz=212888R-free""

Chunk1ac00050sz=212888R-free""

Totalreservedfreespace=638664

Sharedpool的普通区的空闲列表下面就是关于这块sharedpool区中保留区的空闲列表的描述,其中除了在名字上bucket前面都有一个Reserved标识,和状态前面有“R-”前缀外,含义和普通空闲列表相同。

UNPINNEDRECREATABLECHUNKS(lrufirst):

Chunk1aee99c0sz=4096recreate"sqlarea"latch=1D8BDD48

Chunk1ae4aeecsz=4096recreate"sqlarea"latch=1D8BDDB0

......

SEPARATOR

Chunk166e8384sz=540recreate"KQRPO"latch=1DD7F138

Chunk1f333a5csz=284recreate"KQRPO"latch=1DC7DFC8

Chunk166e9340sz=540recreate"KQRPO"latch=1DE00A70

Chunk1f0fe058sz=284recreate"KQRPO"latch=1DC7DFC8

Chunk1f2116b4sz=540recreate"KQRPO"latch=1DE81910

Chunk1f21127csz=540recreate"KQRPO"latch=1DE81910

......

Unpinnedspace=1611488rcr=645trn=864

空闲列表后面就是LRU链表了。LRU链表不是按照大小分的,因而没有Bucket。它的chunk是按照最近最少使用的顺序排列。其中chunk的信息和前面解释的一样。但是要注意一点,因为LRU链表中的chunk都是使用的,因为每个chunk根据用途不同,都会有一个latch来保护,Chunk信息最后便是latch的地址。

注意,我们前面提到,sharedpool中是有两种LRU链表的,一种循环LRU链表;另外一种是暂时LRU链表。在这里LRU信息中前面部分是循环LRU链表,SEPARATOR后面部分是暂时LRU链表信息。

最后是LRU链表中chunk的总的大小,rcr是循环LRU链表中的chunk数,trn是暂时LRU链表中的chunk数。

此外,有一点提示,如果是有多个sharedpool区,第一个区是不含LRU链表信息的。

PERMANENTCHUNKS:

Chunk1d234010sz=1884144perm"perm"alo=1728440

Chunk1cc34000sz=3977544perm"perm"alo=3977544

Chunk1d034000sz=2097168perm"perm"alo=2097168

Chunk1d434000sz=3117112perm"perm"alo=3117112

......

Chunk1f434000sz=3917704perm"perm"alo=3917704

Permanentspace=38937696

最后是永久chunk的信息。Chunk部分解释和前面一致。alo表示已经分配的大小。

如果有多个sharedpool区,永久chunk信息则只存在于第一个sharedpool区。

注释:

sharedpool区就是指sharedpool这个堆中的一个区段(extent)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: