在操作系统命令行上用 TOP来看,可以看到这几个oracle进程占用了很多的虚拟内存
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
 4883 oracle    15   0 3229m 200m 196m S    1  2.5   0:14.92 oracle                                                                 
 4711 oracle    16   0 3227m  94m  92m S    0  1.2   2:51.46 oracle                                                                 
16481 oracle    15   0 3228m 123m 120m S    0  1.5   0:12.30 oracle                                                                 
13324 oracle    16   0 3229m  91m  82m S    0  1.2   0:00.22 oracle PGA设置成了1G
SQL> show parameter pgaNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 1022236K
从这个PGA大小建议来看,PGA只要设置为当前值的一半就够了
SQL>select PGA_TARGET_FOR_ESTIMATE,PGA_TARGET_FACTOR, ESTD_PGA_CACHE_HIT_PERCENTAGE,ESTD_OVERALLOC_COUNT from V$PGA_TARGET_ADVICE;
 PGA_TARGET_FOR_ESTIMATE     PGA_TARGET_FACTOR     ESTD_PGA_CACHE_HIT_PERCENTAGE     ESTD_OVERALLOC_COUNT    
 --------------------------  --------------------  --------------------------------  ----------------------- 
 130845696                   0.125                 89                                1502                    
 261692416                   0.25                  94                                681                     
 523384832                   0.5                   100                               0                       
 785077248                   0.75                  100                               0                       
 1046769664                  1                     100                               0                       
 1256123392                  1.2                   100                               0                       
 1465477120                  1.4                   100                               0                       
 1674830848                  1.6                   100                               0                       
 1884184576                  1.8                   100                               0                       
 2093539328                  2                     100                               0                       
 3140308992                  3                     100                               0                       
 4187078656                  4                     100                               0                       
 6280617984                  6                     100                               0                       
 8374157312                  8                     100                               0                       我的疑问是:
服务器进程占用的内存跟PGA是密切相关的,当PGA中没有足够的内存的时候,就使用到了页的换入换出,也就出现了虚拟内存。我奇怪的是,既然TOP中显示出这些服务器进程由于内存不够用,以至于占用了大量的虚拟内存,那么为什么PGA的建议中却又表示只要一半PGA就够了呢?

解决方案 »

  1.   

    这些进程又不一定都是跟PGA相关的。
    具体还得看你那个进程对应到底在干吗。
    光看以上的应该无法解释。
      

  2.   

    我查过,这些语句都是有对应的SQL语句的。那还需要检查什么?
      

  3.   

    我查过,这些进程都是有对应的SQL语句的。那还需要检查什么?
      

  4.   

    那就需要优化对应的sql语句了。
    PGA是全局的考虑了整个数据库的统计数据的,不会因为几个SQL就要求你调大调小。
      

  5.   

    但是我用top看的时候,这个ORACLE进程是不停地变化,一会是这个进程,一会是那个进程,既然一直有进程内存不够用,为什么PGA还用不完呢。有点想不明白
      

  6.   

    我看了好几个oracle环境,发现不管哪个oracle环境,只要执行top,就总能看到排在前几位的有oracle的进程,占用的虚拟内存很多,不知道哪位能解释一下原因。
    备注:这几个环境对应的应用是不一样的,所以不能一概认为是应用的问题。
    大家可以在自己的环境中执行top看看,是否也能看到这样的现象。