Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3552075
  • 博文数量: 715
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 7745
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(715)

文章存档

2023年(75)

2022年(134)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

最近访客

分类: Oracle

2021-07-03 23:16:19


如何使用 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
      - 其他


  1. - V$PROCESS_MEMORY_DETAIL
  2.     包含每个组件的内存分配细分。
  3.     - 要激活此视图,可以执行以下命令之一:
  4.        SQL> alter session set events'immediate trace name PGA_DETAIL_GET level ';
  5.        或者用 ORADEBUG 命令:
  6.        SQL> ORADEBUG SETMYPID;
  7.        SQL> ORADEBUG DUMP PGA_DETAIL_GET <PID>;
  8.     - 要删除视图中的所有行,请运行以下命令:
  9.        SQL> alter session set events'immediate trace name PGA_DETAIL_CANCEL level ';
  10.        或 ORADEBUG:
  11.        SQL> ORADEBUG DUMP PGA_DETAIL_CANCEL <PID>;

找出是哪个进程继续消耗越来越多的内存。这可以通过使用以下查询找到:

  1. COLUMN alme HEADING "Allocated MB" FORMAT 99999D9
  2. COLUMN usme HEADING "Used MB" FORMAT 99999D9
  3. COLUMN frme HEADING "Freeable MB" FORMAT 99999D9
  4. COLUMN mame HEADING "Max MB" FORMAT 99999D9
  5. COLUMN username FORMAT a15
  6. COLUMN program FORMAT a22
  7. COLUMN sid FORMAT a5
  8. COLUMN spid FORMAT a8
  9. SET LINESIZE 300
  10. SELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time,
  11.        SUBSTR(s.program,1,22) program , s.process pid_remote,
  12.        s.status,
  13.        ROUND(pga_used_mem/1024/1024) usme,
  14.        ROUND(pga_alloc_mem/1024/1024) alme,
  15.        ROUND(pga_freeable_mem/1024/1024) frme,
  16.        ROUND(pga_max_mem/1024/1024) mame
  17. FROM v$session s,v$process p
  18. WHERE p.addr=s.paddr
  19. ORDER BY pga_max_mem,logon_time;
要获得更多详细信息,可以使用 V$PROCESS_MEMORY 查看哪个组件正在长。

  1. COLUMN category HEADING "Category"
  2. COLUMN disabled HEADING "Allocated bytes"
  3. COLUMN used HEADING "Used bytes"
  4. COLUMN max_allocated HEADING "Maxlocated bytes"
  5. SELECT pid, category,located, used, max_allocated
  6. FROM v$process_memory
  7. WHERE pid = (SELECT pid
  8.               FROM v $process
  9.               WHERE addr= (select paddr
  10.                             FROM v$session
  11.                             WHERE sid = 141));
等待几分钟并再次运行查询以查找内存增加的组件.

要想等到详细信息,需要进一步跟踪

  1. alter session set events'immediate trace name PGA_DETAIL_GET level 22'
  2. -- 22是 PID
  3. 或者
  4. ORADEBUG SETMYPID;
    ORADEBUG DUMP PGA_DETAIL_GET 22;
等待几分钟,创建临时表

  1. CREATE TABLE tab1 AS
  2. SELECT category, name, heap_name, bytes, allocation_count,
  3.        heap_descriptor, parent_heap_descriptor
  4. FROM v$process_memory_detail
  5. WHERE pid = 22
  6. AND category = 'Other';
等一段时间再次收集

  1. --还是老方法
  2. alter session set events'immediate trace name PGA_DETAIL_GET level 22'

  3. ORADEBUG SETMYPID;
  4. ORADEBUG DUMP PGA_DETAIL_GET 22;
等待几分钟,然后为进程创建第二个临时表:

  1. CREATE TABLE tab2 AS
  2. SELECT category, name, heap_name, bytes, allocation_count,
  3.        heap_descriptor, parent_heap_descriptor
  4. FROM v$process_memory_detail
  5. WHERE pid = 22
  6. AND category = 'Other';

可以多次执行上述步骤以在更长的时间内收集更多信息不怕麻烦的话)。

出结果:
  1. COLUMN category HEADING "Category"
  2. COLUMN name HEADING "Name"
  3. COLUMN heap_name HEADING "Heap name"
  4. COLUMN q1 HEADING "Memory 1st" Format 999,999,999,999
  5. COLUMN q2 HEADING "Memory 2nd" Format 999,999,999,999
  6. COLUMN diff HEADING "Difference" Format S999,999,999,999
  7. SET LINES 150
  8. SELECT tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.bytes-tab1.bytes diff
  9. FROM tab1, tab2
  10. WHERE tab1.category = tab2.category
  11. AND tab1.name = tab2.name
  12. AND tab1.heap_name = tab2.heap_name
  13. AND tab1.bytes <> tab2.bytes
  14. ORDER BY 6 DESC;

 查询显示最大的内存增加在 kolaGetRfcHeap 中(行,全明白了)。


视图 V$PROCESS_MEMORY_DETAIL 的输出可以与 heapdump 进行比较。

  1. COLUMN heap_name HEADING "heap name"
  2. COLUMN name HEADING "Type"
  3. COLUMN allocation_count HEADING "Count"
  4. COLUMN bytes HEADING "Sum"
  5. COLUMN avg HEADING "Average" FORMAT 99999D99
  6. SELECT heap_name, name, allocation_count, bytes, bytes/allocation_count avg
  7. FROM tab2
  8. WHERE heap_name = 'kolaGetRfcHeap';

heap.awk 处理后的 Heapdump:


参考:
如何查找进程的内存增长位置(文档 ID 822527.1)
阅读(1181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~