{"id":1194,"date":"2012-08-01T14:27:18","date_gmt":"2012-08-01T14:27:18","guid":{"rendered":"http:\/\/blog.designed79.co.uk\/?p=1194"},"modified":"2012-12-20T09:53:52","modified_gmt":"2012-12-20T09:53:52","slug":"auto-purge-memory-in-mac-os-x","status":"publish","type":"post","link":"https:\/\/blog.designed79.co.uk\/?p=1194","title":{"rendered":"Auto Purge Memory in Mac OS X"},"content":{"rendered":"<p>Attached is a python script that shows all of you memory&#8217;s stated<\/p>\n<p><a href=\"https:\/\/blog.designed79.co.uk\/wp-content\/uploads\/2012\/08\/showmemory.py_.zip\">showmemory.py<\/a><\/p>\n<p>Here is the code<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;height:300px;\"><div class=\"text codecolorer\">#!\/usr\/bin\/python<br \/>\n<br \/>\nimport subprocess<br \/>\nimport re<br \/>\n<br \/>\n# Get process info<br \/>\nps = subprocess.Popen(['ps', '-caxm', '-orss,comm'], stdout=subprocess.PIPE).communicate()[0]<br \/>\nvm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0]<br \/>\n<br \/>\n# Iterate processes<br \/>\nprocessLines = ps.split('\\n')<br \/>\nsep = re.compile('[\\s]+')<br \/>\nrssTotal = 0 # kB<br \/>\nfor row in range(1,len(processLines)):<br \/>\nrowText = processLines[row].strip()<br \/>\nrowElements = sep.split(rowText)<br \/>\ntry:<br \/>\nrss = float(rowElements[0]) * 1024<br \/>\nexcept:<br \/>\nrss = 0 # ignore...<br \/>\nrssTotal += rss<br \/>\n<br \/>\n# Process vm_stat<br \/>\nvmLines = vm.split('\\n')<br \/>\nsep = re.compile(':[\\s]+')<br \/>\nvmStats = {}<br \/>\nfor row in range(1,len(vmLines)-2):<br \/>\nrowText = vmLines[row].strip()<br \/>\nrowElements = sep.split(rowText)<br \/>\nvmStats[(rowElements[0])] = int(rowElements[1].strip('\\.')) * 4096<br \/>\n<br \/>\nprint 'Wired Memory:\\t\\t%d MB' % ( vmStats[&quot;Pages wired down&quot;]\/1024\/1024 )<br \/>\nprint 'Active Memory:\\t\\t%d MB' % ( vmStats[&quot;Pages active&quot;]\/1024\/1024 )<br \/>\nprint 'Inactive Memory:\\t%d MB' % ( vmStats[&quot;Pages inactive&quot;]\/1024\/1024 )<br \/>\nprint 'Free Memory:\\t\\t%d MB' % ( vmStats[&quot;Pages free&quot;]\/1024\/1024 )<br \/>\nprint 'Real Mem Total (ps):\\t%.3f MB' % ( rssTotal\/1024\/1024 )<\/div><\/div>\n<p>We can use a bash onliner to find just Inactive ram on the machine, as this is what we are interested in<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">vm_stat | awk '\/inactive\/ {print int($3*4\/1024)}'<\/div><\/div>\n<p>We could use this in a script, launched by Launcd to check at regular intervals and purge inactive memory if over, for example, 500 MB<\/p>\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"co0\">#!\/bin\/bash<\/span><br \/>\n<br \/>\n<span class=\"re2\">MM<\/span>=<span class=\"sy0\">`<\/span>vm_stat <span class=\"sy0\">|<\/span> <span class=\"kw2\">awk<\/span> <span class=\"st_h\">'\/inactive\/ {print int($3*4\/1024)}'<\/span><span class=\"sy0\">`<\/span><br \/>\n<br \/>\n<span class=\"kw3\">echo<\/span> <span class=\"st0\">&quot;Testing status of inactive free memory...&quot;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#91;<\/span> <span class=\"st0\">&quot;<span class=\"es2\">$MM<\/span>&quot;<\/span> <span class=\"re5\">-gt<\/span> <span class=\"st0\">&quot;500&quot;<\/span> <span class=\"br0\">&#93;<\/span>; <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">echo<\/span> <span class=\"st0\">&quot;You have too much inactive free memory.&quot;<\/span> <span class=\"re1\">$MM<\/span><span class=\"st0\">&quot;MB Releasing now...&quot;<\/span><br \/>\n&nbsp; &nbsp; purge<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">exit<\/span> <span class=\"nu0\">0<\/span><br \/>\n<span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">echo<\/span> <span class=\"st0\">&quot;Memory ammount&quot;<\/span> <span class=\"re1\">$MM<\/span><span class=\"st0\">&quot;MB does not meet purge threshold.&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">exit<\/span> <span class=\"nu0\">0<\/span><br \/>\n<span class=\"kw1\">fi<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Attached is a python script that shows all of you memory&#8217;s stated showmemory.py Here is the code #!\/usr\/bin\/python import subprocess import re [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1194","post","type-post","status-publish","format-standard","hentry","category-info-on-tech"],"_links":{"self":[{"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/1194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1194"}],"version-history":[{"count":0,"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/1194\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.designed79.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}