Your SlideShare is downloading. ×
0
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Tuning android for low ram devices
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Tuning android for low ram devices

1,675

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,675
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
17
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Memory Tuning Android for Low-RAM Devices Chris Kühl & Iago López Galeiras, Endocode AG
  • 2. What's low-RAM? < 512MB
  • 3. 512MB? That's so 2012! Why do that to yourself? You have no choice ;) Mod-maintainer for older device Android on embedded devices Virtualized Android, anyone?
  • 4. What to tune? Apps Dalvik VM Activity Manager Linux kernel
  • 5. Apps Be a good citizen Apps that manage their own memory well make the whole system run better
  • 6. Keep Your Apps Trim Google says, You should implement onTrimMemory(int) to incrementally release memory based on current system constraints.
  • 7. 7 Trim Levels Running Cached TRIM_MEMORY_RUNNING_MODERATE TRIM_MEMORY_BACKGROUND TRIM_MEMORY_RUNNING_LOW TRIM_MEMORY_MODERATE TRIM_MEMORY_RUNNING_CRITICAL TRIM_MEMORY_COMPLETE ...and TRIM_MEMORY_UI_HIDDEN TRIM_MEMORY_COMPLETE ≈ onLowMemory
  • 8. Dalvik VM Android Java VM DEX format Zygote
  • 9. Dalvik is chatty Dalvik's logcat output can paint a pretty good picture. 12-3015:35:43.135:D/dalvikvm(15368):GC_EXPLICITfreed39K,66%free2349K/6788K,p aused24ms+8ms,total129ms 12-3015:35:43.682:D/dalvikvm(15368):GC_CONCURRENTfreed282K,5%free10382K/10823 K,paused5ms+4ms 12-3015:35:44.043:D/dalvikvm(15368):GC_CONCURRENTfreed319K,5%free10507K/10951 K,paused3ms+3ms 12-3015:35:44.723:D/dalvikvm(15368):GC_CONCURRENTfreed364K,5%free10568K/11079 K,paused3ms+4ms 12-3015:35:44.803:D/dalvikvm(15368):GC_FOR_ALLOCfreed312K,6%free10549K/11207K ,paused31ms 12-3015:35:45.034:D/dalvikvm(15368):GC_FOR_ALLOCfreed316K,6%free10542K/11207K ,paused48ms 12-3015:35:45.074:D/dalvikvm(15368):GC_FOR_ALLOCfreed1K,6%free10631K/11207K, paused43ms
  • 10. Dalvik Properties Generally set these in PRODUCT_PROPERTY_OVERRIDES. PRODUCT_PROPERTY_OVERRIDES:= dalvik.vm.heapstartsize=5m dalvik.vm.heapgrowthlimit=64m dalvik.vm.heapsize=128m dalvik.vm.heaptargetutilization=0.80 dalvik.vm.heapminfree=512k dalvik.vm.heapmaxfree=2m
  • 11. Dalvik VM - JIT Google says... For the really low-memory devices, we recommend the JIT be disabled entirely. Can save up to 1.5MB per process!
  • 12. ActivityManager Managing activities since 2008
  • 13. ActivityManager & Memory management Continually ranks apps based on their importance to the user.
  • 14. Adjustments staticfinalintHIDDEN_APP_MAX_ADJ=15; staticintHIDDEN_APP_MIN_ADJ=9; staticfinalintSERVICE_B_ADJ=8; staticfinalintPREVIOUS_APP_ADJ=7; staticfinalintHOME_APP_ADJ=6; staticfinalintSERVICE_ADJ=5; staticfinalintBACKUP_APP_ADJ=4; staticfinalintHEAVY_WEIGHT_APP_ADJ=3; staticfinalintPERCEPTIBLE_APP_ADJ=2; staticfinalintVISIBLE_APP_ADJ=1; staticfinalintFOREGROUND_APP_ADJ=0; staticfinalintPERSISTENT_PROC_ADJ=-12; staticfinalintSYSTEM_ADJ=-16;
  • 15. lowmemorykiller A kernel module to preempt the oom and provide an interface for user-space to prioritize apps cat/sys/module/lowmemorykiller/parameters/adj 0,1,2,4,9,15 cat/sys/module/lowmemorykiller/parameters/minfree 3031,4218,5406,7454,8642,10158
  • 16. Configuring lowmemorykiller privatefinalint[]mOomAdj=newint[]{ FOREGROUND_APP_ADJ,VISIBLE_APP_ADJ,PERCEPTIBLE_APP_ADJ, BACKUP_APP_ADJ,HIDDEN_APP_MIN_ADJ,HIDDEN_APP_MAX_ADJ }; privatefinallong[]mOomMinFreeLow=newlong[]{ 8192,12288,16384, 24576,28672,32768 }; privatefinallong[]mOomMinFreeHigh=newlong[]{ 32768,40960,49152, 57344,65536,81920 };
  • 17. dumpsys meminfo TotalPSSbyOOMadjustment: 18642kB:System 18642kB:system(pid451) 13979kB:Persistent 9884kB:com.android.systemui(pid1791) 4095kB:com.android.phone(pid689) 18349kB:Foreground 18349kB:com.android.launcher(pid3106) 18895kB:Visible 9498kB:com.google.process.gapps(pid735) 7078kB:com.google.process.location(pid667) 2319kB:com.android.smspush(pid795) 8222kB:Perceptible 5623kB:com.android.inputmethod.latin(pid646) 2599kB:com.android.location.fused(pid676) 2810kB:AServices 2810kB:de.telekom.droidsync(pid3117) 45844kB:Background 14552kB:android.process.acore(pid3133) 5566kB:com.google.android.syncadapters.calendar(pid3270) 5475kB:com.google.android.apps.genie.geniewidget(pid3185) 4940kB:com.google.android.gsf.login(pid3254) 4362kB:com.android.browser(pid3359) 3898kB:com.android.calendar(pid3305) 3691kB:com.android.providers.calendar(pid3286) 3360kB:com.cyanogenmod.lockclock(pid3327)
  • 18. dumpsys activity oom (1/3) OOMlevels: SYSTEM_ADJ:-16 PERSISTENT_PROC_ADJ:-12 FOREGROUND_APP_ADJ:0 VISIBLE_APP_ADJ:1 PERCEPTIBLE_APP_ADJ:2 HEAVY_WEIGHT_APP_ADJ:3 BACKUP_APP_ADJ:4 SERVICE_ADJ:5 HOME_APP_ADJ:6 PREVIOUS_APP_ADJ:7 SERVICE_B_ADJ:8 HIDDEN_APP_MIN_ADJ:10 HIDDEN_APP_MAX_ADJ:15
  • 19. dumpsys activity oom (2/3) ProcessOOMcontrol: PERS#7:adj=sys /F trm=15451:system/1000(fixed) oom:max=-16hidden=10client=10empty=10curRaw=-16setRaw=-16cur=-16set=-16 keeping=truehidden=falseempty=falsehasAboveClient=false PERS#10:adj=pers/F trm=15689:com.android.phone/1001(fixed) oom:max=-12hidden=10client=10empty=10curRaw=-12setRaw=-12cur=-12set=-12 keeping=truehidden=falseempty=falsehasAboveClient=false PERS#3:adj=pers/F trm=151791:com.android.systemui/u0a10030(fixed) oom:max=-12hidden=10client=10empty=10curRaw=-12setRaw=-12cur=-12set=-12 keeping=truehidden=falseempty=falsehasAboveClient=false Proc#0:adj=fore/FAtrm=153106:com.android.launcher/u0a10022(top-activity) oom:max=15hidden=10client=10empty=10curRaw=0setRaw=0cur=0set=0 keeping=truehidden=falseempty=falsehasAboveClient=false Proc#9:adj=vis /F trm=15795:com.android.smspush/u0a10032(service) com.android.smspush/.WapPushManager<=Proc{689:com.android.phone/1001} oom:max=15hidden=10client=10empty=10curRaw=1setRaw=1cur=1set=1 keeping=truehidden=falseempty=truehasAboveClient=false
  • 20. dumpsys activity oom (3/3) ProcessesthatarewaitingtoGC: ProcessProcessRecord{422a4260735:com.google.process.gapps/u0a10033} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago ProcessProcessRecord{422f13b0451:system/1000} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago ProcessProcessRecord{4247c388667:com.google.process.location/u0a10033} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago ProcessProcessRecord{4231a630646:com.android.inputmethod.latin/u0a10021} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago ProcessProcessRecord{4250cfe0676:com.android.location.fused/u0a10018} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago ProcessProcessRecord{422f2dd81791:com.android.systemui/u0a10030} lowMem=true,lastgced=3110616msago,lastlowMem=18198msago
  • 21. Now for the Kernel Bits
  • 22. KSM Kernel SamePage Merging KSM can save about 20-30MB of RAM if given a chance
  • 23. Enabling KSM This is easy-peasy echo1|tee/sys/kernel/mm/ksm/run echo1000|tee/sys/kernel/mm/ksm/sleep_millisecs echo128|tee/sys/kernel/mm/ksm/pages_to_scan
  • 24. Oh yeah... You need to mark pages as mergeable. void*mmap(void*addr,size_tsize,intprot,intflags,intfd,off_toffset){ ... if(result!=MAP_FAILED&&(flags&(MAP_PRIVATE|MAP_ANONYMOUS))!=0){ ErrnoRestorererrno_restorer; madvise(result,size,MADV_MERGEABLE); } returnresult; }
  • 25. Is it working? dumpsys meminfo answers this TotalPSS:126741kB KSM:6672kBsavedfromshared1128kB 24552kBunshared;102936kBvolatile
  • 26. extra_free_kbytes Raises the low water mark used to trigger kswapd
  • 27. References Dalvik VM Internals - 2008 Google I/O A JIT Compiler for Android's Dalvik VM - 2010 Google I/O Running Android with low RAM Managing Your App's Memory Investigating your RAM Usage Understanding the Linux Virtual Memory Manager - Zones Reducing Memory Access Lateny
  • 28. THE END

×