如何使用 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)
阅读(1348) | 评论(0) | 转发(0) |