Test in 10.2.0.4 on Linux x86_64 SQL> select spid, sid from v$process a, v$session b where a.addr = b.paddr and sid = (select sid from v$mystat where rownum = 1); SPID SID ------------ ------------ 13237 822 SQL> select value from v$mystat where statistic# = 25; <-- session pga memory VALUE ------------ 3052832 --PGA size in v$sesstat always seems to be between PGA_USED_MEM and PGA_ALLOC_MEM SQL> select pga_used_mem,pga_alloc_mem,pga_freeable_mem,pga_max_mem from v$process where spid = 13237; PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM ------------ ------------- ---------------- ------------ 2506389 5494437 393216 5494437 Calculate process private memory (4252 MB is from top -p): $ ps -ovsz,rss -p 13237 VSZ RSS 157884 28724 <-- virtual size (in KB) not matching anything because "Device mappings are currently excluded" (man page) $ top -p 13237 ... PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13237 oracle 15 0 4252m 28m 21m S 0.0 0.4 0:00.12 oracle <-- RES matches RSS above SQL> show sga Total System Global Area 4294967296 bytes ... 4252*1048576-4294967296=163577856 This 163577856 bytes is its private mem viewed from OS, much higher than the allocated PGA viewed from inside Oracle (5494437). If the server runs out of memory, find the processes with the highest private *resident* memory. The way to find memory that is both private and resident varies with OS version. On Red Hat 4, it is #Show the top 10 $ORACLE_SID instance processes using most private resident memory on RHEL 4 #Adjust the first `ps ...` pattern match if needed SGA=8589934592 #replace with your instance SGA ("Total System Global Area" of SQL*Plus command "show sga") echo "pid priv_res_mem(bytes)" (for i in `ps -fu oracle | grep $ORACLE_SID | grep -v grep | awk '{print $2}'`; do echo -n "$i "; echo "`ps -orss= -p $i`*1024-$SGA" | bc; done) | sort -k2 -nr | head You can also get the total private resident memory. #Total private resident memory of $ORACLE_SID instance processes in bytes on RHEL 4 SGA=8589934592 #replace with yours (for i in `ps -fu oracle | grep $ORACLE_SID | grep -v grep | awk '{print $2}'`; do echo "`ps -orss= -p $i`*1024-$SGA" | bc; done) | awk '{sumrss+=$1} END {print sumrss}' On Red Hat 5, it becomes easier because process resident memory seems to already exclude shared memory. #Show the top 10 $ORACLE_SID instance processes using most private resident memory on RHEL 5 #Adjust the first `ps ...` pattern match if needed echo "pid priv_res_mem(KB)" (for i in `ps -fu oracle | grep $ORACLE_SID | grep -v grep | awk '{print $2}'`; do echo -n "$i "; ps -orss= -p $i; done) | sort -k2 -nr | head #Total private resident memory of $ORACLE_SID instance processes in KB on RHEL 5 (for i in `ps -fu oracle | grep $ORACLE_SID | grep -v grep | awk '{print $2}'`; do echo -n "$i "; ps -orss= -p $i; done) | awk '{sumrss+=$1} END {print sumrss}' Total instance PGA: SQL> show parameter pga_aggregate_target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 2G SQL> select sum(pga_used_mem),sum(pga_alloc_mem),sum(pga_freeable_mem),sum(pga_max_mem) from v$process; SUM(PGA_USED_MEM) SUM(PGA_ALLOC_MEM) SUM(PGA_FREEABLE_MEM) SUM(PGA_MAX_MEM) ----------------- ------------------ --------------------- ---------------- 238235981 583439693 74711040 864778045 SQL> select * from v$pgastat; NAME VALUE UNIT ------------------------------------- ------------ ------------ aggregate PGA target parameter 2147483648 bytes <-- equals pga_aggregate_target aggregate PGA auto target 1718332416 bytes global memory bound 214743040 bytes total PGA inuse 238131200 bytes <-- sum(pga_used_mem) from v$process total PGA allocated 583360512 bytes <-- sum(pga_alloc_mem) from v$process maximum PGA allocated 10277870592 bytes <-- higher than sum(pga_max_mem) from v$process; some proc's exited total freeable PGA memory 74711040 bytes <-- sum(pga_freeable_mem) from v$process ... (Do not trust 'session pga memory' in v$sysstat. Documentation warns it.)