Note

Here the long story:

Code: FOREGROUND_APP: // This is the process running the current foreground app. We'd really // rather not kill it! Value set in system/rootdir/init.rc on startup. VISIBLE_APP: // This is a process only hosting activities that are visible to the // user, so we'd prefer they don't disappear. Value set in // system/rootdir/init.rc on startup. SECONDARY_SERVER: // This is a process holding a secondary server -- killing it will not // have much of an impact as far as the user is concerned. Value set in // system/rootdir/init.rc on startup. HIDDEN_APP: // This is a process only hosting activities that are not visible, // so it can be killed without any disruption. Value set in // system/rootdir/init.rc on startup. CONTENT_PROVIDER: // This is a process with a content provider that does not have any clients // attached to it. If it did have any clients, its adjustment would be the // one for the highest-priority of those processes. EMPTY_APP: // This is a process without anything currently running in it. Definitely // the first to go! Value set in system/rootdir/init.rc on startup. // This value is initalized in the constructor, careful when refering to // this static variable externally.

Fortunately, it is possible to configure the lowmemorykiller at runtime!

Code: # cat /sys/module/lowmemorykiller/parameters/minfree

Code: 1536,2048,4096,5120,5632,6144

Code: # echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree

Code: echo "1536,3072,4096,21000,23000,25000" > /sys/module/lowmemorykiller/parameters/minfree

Hi!I just was curious if already someone tried to play around with Android's internal low-memory task killer.We all know that Android uses a different way of handling processes. Instead of killing every process after its Activity ended, processes are kept until the system needs more memory. These processes usually should not harm the overall performance and should give speed improvements if you start an Activity again. That's the idea.But when does Android kill a process? And which process? As far as I understood android keeps a LRU (last recently used) list and starts killing the oldest unneeded process. This way it is much smarter than any of the taskkillers we see in the Market.Just for curiosity I started to investigate how this mechanism works. Please correct me if you think that I got something wrong:ActivityManagerService.java tracks the "importance" of processes (is foreground, is running a service, ..) and reflects this importance by setting the "oom_adj" value of the process.It seems that on Android the current forefround application gets an oom_adj value of 0 and as soon it's not visible anymore it gets some higher value. I assume the concrete value is dependent by the processes' place in the LRU list.The out-of-memory killer in the standard Linux kernel only runs in one situation: when the available memory is critical low. However in the Android Linux kernel there is implemented a more fine-grained handling of low memory situations.I found the kernel source file "" (located in the kernel source tree under "drivers/misc/"; or look here for GIT source tree: http://tinyurl.com/lowmemkiller ).This module seems to be more configurable than the kernel's standard out-of-memory killer as you can define more than one memory limit, when it should get active and you can tell it which oom_adj values it may kill.In other words:You can say "So it's possible to define multiple memory criterias and matching processes which can be killed in these situations. Android seems to group running processes into 6 different categories (comments taken out of "ActivityManagerServer.java"):These 6 categories are reflected by 6 memory limits which are configured for the lowmemorykiller in the kernel.(But only if you are root). The configuration is set in the file: "/sys/module/lowmemorykiller/parameters/minfree"So if you want to see the current settings, you can do:This should produce output like this (or similiar):These values are the 6 memory limits on which Anedroid starts to kill processes of one of the 6 categories above. Be careful, the!! 1 page = 4 kilobyte.So the example above says that Anddroid starts killing EMPTY_APP processes if available memory goes below 24MB (=6144*4/1024). And it starts to kill unused CONTENT_PROVIDERs if available memory goes below 22MB (=5632*4/1024).So if you want to try if your Hero goes faster when fewer processes are running you can try to adjust these settings. For example if you practically do not want any empty processes you can set the corresponding value very high. For example, you can set the values like this:This example will tell Android to kill unused Content providers if less then 60MB is available and kill empty processes if available memory goes below 90MB.All other processes will stay untouched! Do you see the advantage compared to process killers?One word about durabilty:If you change the settings like this, they are. They will be gone after the next restart of your phone. So you can try to play around a little bit. Please share your results if you find some improvements!To make this settings survive also reboots you need to somehow set this at startup. I am running Modaco's custom rom and added the command to the startup script /system/init.d/ramzswap.sh, but there may be other ways to do this.Currently I also disabled compcache on my Hero and set the lowmemkiller very aggressive, as it seems to me that this makes my hero very responsive.So these are my (current) settings:(and compcache disabled)But play around.. I am glad about any feedback.Please also give feedback if I am wrong or missed something!Thx!