on some of the app boxes at work we have an issue with tomcat not free’ing up cached memory quickly after either a tomcat restart or tomcat stop so we did some google-ing to find a way to quickly free up cached memory.

what this script does is sync writes the cache then echo 3 > /proc/sys/vm/drop_caches frees pagecache and inode/dentry caches.

here is the result :

#!/bin/bash

BC=`which bc`

if [ -z $BC ]; then
    printf "\nbc not found.\n"
    exit 1
fi

fm_pre=`echo \`cat /proc/meminfo | grep MemFree | tr -s ' ' | cut -d ' ' -f2\`/1024.0 | $BC`
cm_pre=`echo \`cat /proc/meminfo | grep "^Cached" | tr -s ' ' | cut -d ' ' -f2\`/1024.0 | $BC`
m_tot=`echo \`cat /proc/meminfo | grep MemTotal | tr -s ' ' | cut -d ' ' -f2\`/1024.0 | $BC`

printf "This script clears cached mem and free's up some ram.\n"
printf "cached memory : ${cm_pre}mb\n"
printf "free memory   : ${fm_pre}mb\n"
printf "total memory  : ${m_tot}mb\n"

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

fm_post=`echo \`cat /proc/meminfo | grep MemFree | tr -s ' ' | cut -d ' ' -f2\`/1024.0 | $BC`

printf "\nmemory freed  : `echo "${fm_post} - ${fm_pre}" | $BC`mb\n"
printf "total free    : ${fm_post}mb\n"

this script is run on several boxes all with kernels of 2.6.22 and higher and it also assumes that you have GNU bc installed (on gentoo: sys-devel/bc).

output of the script should look similar to :

> ./freemem.sh
This script clears cached mem and free's up some ram.
cached memory : 154mb
free memory   : 2672mb
total memory  : 3956mb
Password:

memory freed : 57mb
total free   : 2729mb

in the output, the password is required since i have the sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches" line which i did not give password-less sudo access.