SHARED POOL中KGH: NOACCESS占用大量内存的问题分析

本文深入分析了ORA-04031错误中的KGH:NOACCESS组件,探讨其在SHAREDPOOL与BUFFERCACHE间的角色,及如何通过调整参数或禁用ASMM来避免内存频繁重分配导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇的ORA-04031错误,知道整个SHARED POOL的组件中,ASM extent pointer array占用很大的内存是显示的一个BUG后,继续分析各个组件占用的内存大小,结果发现KGH: NO ACCESS组件也占用了400多M,这个又是个什么鬼东西呢?还是看看METALINK上怎么说的吧。

[@more@]

首先找到了下面一篇文章:
https://metalink.oracle.com/metalink/plsql/f?p=130:14:4157546628394209832::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,461160.1,1,0,1,helvetica

Applies to:
Oracle Server - Enterprise Edition - Version: 10.2.0.1
This problem can occur on any platform.

Symptoms

Frequent ORA-4031 even after increasing SGA_TARGET, Shared_pool

Things observed:

1) ASMM

Sga_target is set

2) 'KGH: NO ACCESS' increasing in shared pool
SQL> select * from v$sgastat where pool = 'shared pool' and (name in ('free memory', 'sql area', 'library cache', 'miscellaneous', 'row cache', 'KGH: NO ACCESS') );

We can see High KGH: NOACCESS entries in the shared pool.
Cause

Bug 5045507 ASMM - FREQUENT RESIZING OF SHARED POOL & BUFFER CACHE

Symptoms:

1) The allocation between shared pool and default buffer cache is growing/shrinking regularly (every 1-5 minutes).

2) AWR report OR query on v$sgastat shows high value for " KGH: NOACCESS "

3) Disabling Automatic Shared Memory Management (ASMM) not causing the ORA-4031 errors
Solution

This is caused because of frequent allocation operation between shared pool and default buffer cache. Alllocation from buffer cache is being converted to "KGH: NOACCESS" in the shared pool.

This trashing from cache to shared pool was fixed in 10.2.0.2. Bug 4507532 (Unpublished) was used to fix it into 10.2.0.2

Patch for Bug 4507532 (Unpublished) cannot be provided on top of 10.2.0.1

So, the options to resolve this issue are

1) Upgrade to the latest patchset 10.2.0.3

OR

2) Disable ASMM as a workaround.

这篇文章上说的是从BUFFER CACHE收刮来的内存,被分配给SHARED POOL的时候,就是先被标识为KGH: NOACCESS,然后SHARED POOL的其他组件可以从这个KGH: NOACCESS组件中再来取自己需要的内存。那既然KGH: NOACCESS组件有500M,为啥还会报ORA-04031错呢,又往下看,发现我的现象跟这里说的一摸一样,就是BUFFER CACHE和SHARED POOL两个组件之间不停的在GROW和SHRINK,就那几十M的内存在两个池之间不停的搬过来搬过去,也不闲累,而且,在RAC环境中,只有其中一个节点有这样的问题,这又是为啥呢?

还找到了另一篇文章:
https://metalink.oracle.com/metalink/plsql/f?p=130:14:4157546628394209832::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,451960.1,1,1,1,helvetica

Oracle Server - Enterprise Edition - Version: 10.1 to 10.2
Information in this document applies to any platform.
Goal
The value for the component 'KGH: NO ACCESS' in the Shared Pool is growing when ASMM is enabled by setting SGA_TARGET. What does this component signify? How to prevent the growth of this component?
Solution
'KGH: NO ACCESS' refers to granules that are in transit with ASMM i.e memory being reassigned from the Shared Pool to the Database Buffer Cache and vice-versa.

This memory component in the Shared Pool marked as 'KGH: NO ACCESS' is used by the Buffer Cache.

One could see the value for this component increasing when ASMM (Automatic Shared Memory Management) is enabled by setting the SGA_TARGET parameter.

When ASMM is enabled, Oracle will dynamically manage the memory allocations between the tunable pools based on the requirement.

Note that one can still specify a value for the each of the tunable parameters i.e Shared Pool, Database Buffer Cache, Large Pool, Java Pool and Streams Pool when ASMM is enabled. When minimum value for each of the tunable parameters is set, Oracle will make sure that the amount of memory being allocated for the corresponding pool will not shrink below the specified amount.

Thus by setting minimum value for the Shared Pool and Database Buffer Cache, we will be ensuring that the amount of memory available for reassignment between the two pools will be lesser thus preventing the growth of this 'KGH: NO ACCESS' component.

To prevent the growth of this component you can either

1> Disable ASMM

Or

2> Set the minimum values for the Shared Pool and the Database Buffer Cache

这上面又说SHARED POOL中的KGH: NO ACCESS是被BUFFER CACHE使用的,这个好像和前面的说法正好反过来了,是我E文太烂了还是ORACLE自己也搞糊涂了呢?

正过来反过去,反正这个东西就是游离在BUFFER CACHE和SHARED POOL之间的一块内存。另外一个问题就是,因为BUG的原因,使用ASMM会导致SHARED POOL和BUFFER CACHE会频繁的被扩大和缩小。解决的办法要么就不要使用ASSM,要不就升级。

这里暂时把SHARED POOL的最小值扩大了一些,让他怎么扩大缩小都不要导致ORA-04031就好

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

转载于:http://blog.itpub.net/25016/viewspace-1004637/

<think>嗯,用户问的是V$SGASTAT视图中为什么没有NAME='KGL Heap'。我需要先理解V$SGASTAT的作用。根据引用[1]和[2],V$SGA_DYNAMIC_COMPONENTS记录的是动态内存区的调整情况,而SGA是系统全局区,包含各种数据结构。V$SGASTAT应该显示SGA各个子池的统计信息。 KGL Heap是Oracle中用于管理共享SQL和PL/SQL的内存结构,属于共享池的一部分。但用户发现V$SGASTAT里没有这个条目。可能的原因有几个方向: 首先,内存分类的差异。V$SGASTAT可能按大类统计,比如共享池作为一个整体,而KGL Heap是其子组件,所以不会被单独列出。需要确认视图的颗粒度。 其次,版本差异。不同Oracle版本可能在视图中公开的信息不同,可能旧版本不显示KGL Heap,或者该名称在视图中用了其他别名。比如是否有其他NAME对应KGL Heap。 另外,权限问题。用户是否有权限查看某些内部结构?但通常V$SGASTAT是公开的,所以可能性较低。或者KGL Heap的信息存在其他视图中,比如V$SGA_DYNAMIC_COMPONENTS或其他内部视图。 还要考虑KGL Heap的分配位置。共享池中的内存分为多个堆,KGL Heap用于库缓存,可能被归类到共享池的总统计中,而不是单独显示。比如,V$SGASTAT中的共享池条目已经包含了KGL Heap的内存使用,所以不需要单独列出。 需要检查官方文档,确认V$SGASTAT的字段定义,以及KGL Heap的归属。可能官方解释是这些内部结构不在V$SGASTAT中展示,而是通过其他方式查询,比如X$表或特定的内部视图。 总结可能的原因:1. 分类不同,属于共享池子组件;2. 名称不同;3. 版本问题;4. 信息存储在其他视图中。需要建议用户检查共享池的总大小,或者查询其他视图如V$LIBRARYCACHE来间接了解KGL Heap的情况。</think>关于$V\$SGASTAT$视图中缺失$NAME='KGL\ Heap'$的原因,需要从Oracle内存管理机制进行分析: ### 一、KGL Heap的作用与归属 KGL Heap(Kernel Generic Library Heap)是Oracle用于存储共享SQL、PL/SQL代码及元数据的核心内存结构,属于$library\ cache$的底层实现。它通过内存堆(heap)管理方式分配共享池(Shared Pool)中的内存块,主要服务于SQL解析、执行计划缓存等关键功能[^2][^3]。 ### 二、V$SGASTAT视图特性 1. **统计粒度限制** $V\$SGASTAT$记录的是SGA中**可统计子池**(Subpool)级别的内存分配,而KGL Heap作为共享池内部的细分结构,其内存分配信息通常被合并到更高层级的统计项: ``` SELECT * FROM V$SGASTAT WHERE POOL = 'shared pool' AND NAME LIKE '%KGL%'; ``` 典型输出会显示更宏观的分类,如"KGH: NO ACCESS"等 2. **内存可见性差异** KGL Heap的内存分配通过内部X$表(如X$KGLDP)管理,这些底层结构在标准性能视图中可能以聚合形式呈现。Oracle刻意隐藏部分底层细节以防止误读[^1] ### 三、验证方法 可通过以下方式间接确认KGL Heap状态: ```sql -- 查看共享池整体使用 SELECT * FROM V$SGASTAT WHERE POOL = 'shared pool'; -- 检查library cache内存分布 SELECT * FROM V$LIBRARYCACHE; -- 查询隐藏参数(需DBA权限) SELECT x.ksppinm, y.ksppstvl FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND x.ksppinm LIKE '%kgl%'; ``` ### 四、替代分析工具 对于KGL Heap的详细分析,建议使用: 1. **Heapdump工具**: ``` ALTER SESSION SET EVENTS 'immediate trace name HEAPDUMP level 2'; ``` 2. **X$KGLDP表**(需DBA权限)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值