After reducing the SGA via above steps. All you need to do is make sure that memory use is as efficient as possible.
If the application using the db has a lot of packages(procedures,functions) check to see what the number of executions is for each and pin the most used into the SGA.
Why? this will reduce the overhead to reload into memory.
Here are some alternative scripts to check free and freeable memory
Try this script for SGA
PROMPT R-free = Shared pool reserved size
PROMPT R-freea = reserved memory
PROMPT free = This is the amount of contiguous free memory available
PROMPT freeabl = Used memory is freeable
PROMPT perm = Freed memory not yet available
PROMPT recr = Reserved
select sum(ksmchsiz) Bytes, ksmchcls Status
group by ksmchcls;
And this for buffer_cache (requires catparr.sql to have been run)
PROMPT State 0 = Buffers that have NOT been used
PROMPT State 1 = Buffers that have been used
select state, count(*)
group by state;
decode(state,0, 'FREE',1,decode(lrba_seq,0,'AVAILABLE','BEING USED'),3, 'BEING USED', state) "BLOCK
decode(state,0, 'FREE',1,decode(lrba_seq,0,'AVAILABLE','BEING USED'),3, 'BEING USED', state);