如何使用 v$process_memory 和 v$process_memory_detail 来确定内存增chang的位置。
(知道有这个视图后试了几次就从没看到过数据,原来不会用)
在 oracle 10.2 及更高版本中存在 2 个新视图,可用于查找内存继续增chang的位置。可以使用此视图代替堆转储来查找内存增长的位置:
- v$process_memory:
此视图按每个 oracle 进程的命名组件类别显示动态 pga 内存使用情况。该视图将包含每个 oracle 进程最多六行,一行用于:
- java
- pl/sql
- olap
- sql
- freeable
- 其他
-
- v$process_memory_detail
-
包含每个组件的内存分配细分。
-
- 要激活此视图,可以执行以下命令之一:
-
sql> alter session set events'immediate trace name pga_detail_get level ';
-
或者用 oradebug 命令:
-
sql> oradebug setmypid;
-
sql> oradebug dump pga_detail_get <pid>;
-
- 要删除视图中的所有行,请运行以下命令:
-
sql> alter session set events'immediate trace name pga_detail_cancel level ';
-
或 oradebug:
-
sql> oradebug dump pga_detail_cancel <pid>;
找出是哪个进程继续消耗越来越多的内存。这可以通过使用以下查询找到:
-
column alme heading "allocated mb" format 99999d9
-
column usme heading "used mb" format 99999d9
-
column frme heading "freeable mb" format 99999d9
-
column mame heading "max mb" format 99999d9
-
column username format a15
-
column program format a22
-
column sid format a5
-
column spid format a8
-
set linesize 300
-
select s.username, substr(s.sid,1,5) sid, p.spid, logon_time,
-
substr(s.program,1,22) program , s.process pid_remote,
-
s.status,
-
round(pga_used_mem/1024/1024) usme,
-
round(pga_alloc_mem/1024/1024) alme,
-
round(pga_freeable_mem/1024/1024) frme,
-
round(pga_max_mem/1024/1024) mame
-
from v$session s,v$process p
-
where p.addr=s.paddr
-
order by pga_max_mem,logon_time;
要获得更多详细信息,可以使用 v$process_memory 查看哪个组件正在长。
-
column category heading "category"
-
column disabled heading "allocated bytes"
-
column used heading "used bytes"
-
column max_allocated heading "maxlocated bytes"
-
select pid, category,located, used, max_allocated
-
from v$process_memory
-
where pid = (select pid
-
from v $process
-
where addr= (select paddr
-
from v$session
-
where sid = 141));
等待几分钟并再次运行查询以查找内存增加的组件.
要想等到详细信息,需要进一步跟踪
-
alter session set events'immediate trace name pga_detail_get level 22'
-
-- 22是 pid
-
或者
-
oradebug setmypid;
oradebug dump pga_detail_get 22;
等待几分钟,创建临时表
-
create table tab1 as
-
select category, name, heap_name, bytes, allocation_count,
-
heap_descriptor, parent_heap_descriptor
-
from v$process_memory_detail
-
where pid = 22
-
and category = 'other';
等一段时间再次收集
-
--还是老方法
-
alter session set events'immediate trace name pga_detail_get level 22'
-
或
-
oradebug setmypid;
-
oradebug dump pga_detail_get 22;
等待几分钟,然后为进程创建第二个临时表:
-
create table tab2 as
-
select category, name, heap_name, bytes, allocation_count,
-
heap_descriptor, parent_heap_descriptor
-
from v$process_memory_detail
-
where pid = 22
-
and category = 'other';
可以多次执行上述步骤以在更长的时间内收集更多信息(不怕麻烦的话)。
出结果:
-
column category heading "category"
-
column name heading "name"
-
column heap_name heading "heap name"
-
column q1 heading "memory 1st" format 999,999,999,999
-
column q2 heading "memory 2nd" format 999,999,999,999
-
column diff heading "difference" format s999,999,999,999
-
set lines 150
-
select tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.bytes-tab1.bytes diff
-
from tab1, tab2
-
where tab1.category = tab2.category
-
and tab1.name = tab2.name
-
and tab1.heap_name = tab2.heap_name
-
and tab1.bytes <> tab2.bytes
-
order by 6 desc;
查询显示最大的内存增加在 kolagetrfcheap 中(行,全明白了)。
视图 v$process_memory_detail 的输出可以与 heapdump 进行比较。
-
column heap_name heading "heap name"
-
column name heading "type"
-
column allocation_count heading "count"
-
column bytes heading "sum"
-
column avg heading "average" format 99999d99
-
select heap_name, name, allocation_count, bytes, bytes/allocation_count avg
-
from tab2
-
where heap_name = 'kolagetrfcheap';
heap.awk 处理后的 heapdump:
参考:
如何查找进程的内存增长位置(文档 id 822527.1)
阅读(1086) | 评论(0) | 转发(0) |