Firstly, often the OS will give misleading information about memory, because Oracle uses shared memory. For example, if the SGA is 500M, then a 10 processes might show (say) 520M each, because they are attached to 500M of shared memory, and are using 20M of their own.
Probably the best way to see process level memory is by looking at v$sesstat
select
st.sid,
s.name,
st.value
from v$statname s, v$sesstat st
where st.STATISTIC# = s.STATISTIC#
and s.name like '%pga%'
From each session, you can drill into v$active_session_history to what sql's they have been running, and use the SQL_ID to look in v$sqlstats
Dont forget - it might not be SQL that chews memory - it could be PLSQL programs etc.