ticonnect: memory management in titanium apps

45
Memory Management in Titanium Apps TIM POULSEN SOFTWARE ENGINEER, TOOLING TEAM @skypanther

Upload: tim-poulsen

Post on 19-Jun-2015

445 views

Category:

Technology


3 download

DESCRIPTION

Slides from my presentation at the 2014 ConnectJS / TiConnect conference in Atlanta. I cover tips and background info on managing memory and performance in your Titanium apps.

TRANSCRIPT

Page 1: TiConnect: Memory Management in Titanium apps

Memory Management in Titanium AppsTIM POULSENSOFTWARE ENGINEER, TOOLING TEAM

@skypanther

Page 2: TiConnect: Memory Management in Titanium apps

What are our goals?

No crashesFast, responsive appsDo moreLonger battery lifeHappy users!

<0.1 second = “instant”<1 second = “uninterrupted”~10 seconds = user loses attention -- Nielsen Norman Group

Page 3: TiConnect: Memory Management in Titanium apps

Topics I’ll cover

Memory limitsWhat uses memoryGarbage collectionGarbage is goodAlloy specificsProfiling

http://muppet.wikia.com/wiki/I_Love_Trash

Page 4: TiConnect: Memory Management in Titanium apps

Memory limits

Pre-ICS ~16-24 MBNexus 4 ~96 MB“Large heap” enabled ~128 MB+

iPhone 4 ~50 MBiPhone 5/5s ~100 MBiPad2 ~50 MBiPad Air ~100 MB

(Limit ~10% of device RAM)

Page 5: TiConnect: Memory Management in Titanium apps

What’s in a Titanium app?

Your app’s code

Titanium APIs

Kroll bridge

Native components & libraries

• Your app’s code• Alloy’s libraries• Graphics• Custom fonts• Data – queries,

network calls, etc.

Page 6: TiConnect: Memory Management in Titanium apps

Garbage Collection

Page 7: TiConnect: Memory Management in Titanium apps

Garbage Collection

Memory Management Masterclass, Addy Osmani https://www.youtube.com/watch?v=LaxbdIyBkL0

Garbage

Page 8: TiConnect: Memory Management in Titanium apps

Garbage Collection

Obj 1 Obj 2 Obj 4Obj

3Live

Reserve

Memory Management Masterclass, Addy Osmani https://www.youtube.com/watch?v=LaxbdIyBkL0

Obj 5

GC Pause

Page 9: TiConnect: Memory Management in Titanium apps

JavaScript Mark & Sweep

Obj 1 Obj 2 Obj 4Ob

j 3Live

Reserve

Memory Management Masterclass, Addy Osmani https://www.youtube.com/watch?v=LaxbdIyBkL0

Obj 5

Page 10: TiConnect: Memory Management in Titanium apps

JavaScript & native objects

Your app’s code

Titanium APIs

Kroll bridge

Native components & libraries

Object

Object

Page 11: TiConnect: Memory Management in Titanium apps

Native memory cleanup

Android / Java layer GC:Runs at its own intervalSlower & less frequent

iOSManual allocation/de-allocation by core SDKARC supported in modules

Page 12: TiConnect: Memory Management in Titanium apps

Garbage Collection Takeaways

Every allocation gets you closer to a GC pauseMore objects = more time for GCGC is automaticJavaScript and native processes to consider

http://muppet.wikia.com/wiki/I_Love_Trash

Page 13: TiConnect: Memory Management in Titanium apps

Efficient and garbage-friendly

Page 14: TiConnect: Memory Management in Titanium apps

Efficient and GC friendly

Watch those imagesAvoid global variablesDon’t create variables you don’t need toClean up after yourselfA couple of extras...

Page 15: TiConnect: Memory Management in Titanium apps

Images

Decompressed in memoryFile format doesn’t matter!Pixels and color depth doUse scaled resolutionsLazy load themRemove them when you canDon’t use them

200 by 200 px image= 40,000 pixels x 32 bits per pixel= 1,280,000 bits= 160,000 Bytes= 156.25 KB= ~1/6th MB

A 1536 x 2048 image ~ 12 MB

“Why not just use xhdpi images across all resolutions and let the device scale to the right size?” -- Q&A user

“I’ve got a table with 200 rows, each with an image and my app crashes. Titanium sucks” -- Q&A user

Page 16: TiConnect: Memory Management in Titanium apps

Custom fonts

Page 17: TiConnect: Memory Management in Titanium apps

Don’t use global variables

Scope - global & functionGlobals are bad:

Can’t be garbage collectedCollisions (unintended value changes)

Watch for accidental globalsUse scope to your advantage:

Wrap in functions / IIFEs

Page 18: TiConnect: Memory Management in Titanium apps

Locals & Globals

Page 19: TiConnect: Memory Management in Titanium apps

CommonJS Singleton

Page 20: TiConnect: Memory Management in Titanium apps

Don’t create variables you don’t need to

Page 21: TiConnect: Memory Management in Titanium apps

Don’t create variables you don’t need to

Page 22: TiConnect: Memory Management in Titanium apps

Closures

Page 23: TiConnect: Memory Management in Titanium apps

Unintended references

Page 24: TiConnect: Memory Management in Titanium apps

Clean up

Set to null or undefinedLet JavaScript clean up for youAvoid tight loops

Page 25: TiConnect: Memory Management in Titanium apps

IIFEs (self-calling functions)

Page 26: TiConnect: Memory Management in Titanium apps

Too tight

Page 27: TiConnect: Memory Management in Titanium apps

Process data in the right place

Data Data

SQLite

Page 28: TiConnect: Memory Management in Titanium apps

Android specifics

Use the R bitmapsStop servicesClean up in onPause() or onuserleavehint eventEspecially sensitive to rapid allocation/de-allocation

Page 29: TiConnect: Memory Management in Titanium apps

Alloy considerations

Page 30: TiConnect: Memory Management in Titanium apps

Alloy considerations

Use the frameworkModel/Collection referencesJust don’t – er, clean-up functionsRemember the basics

Page 31: TiConnect: Memory Management in Titanium apps

Use the framework

config.json Alloy.CFG.fooAlloy.Globals -> delete Alloy.Globals.fooCompiler / platform directives

(OS_IOS, OS_ANDROID, etc.)

Page 32: TiConnect: Memory Management in Titanium apps

But don’t abuse it

Don’t put images or large objects into Alloy.GlobalsDon’t declare variables in alloy.jsController listeners: $.view.on() and $.view.off()

Model/Collection listeners: coll.on() and coll.off()

Page 33: TiConnect: Memory Management in Titanium apps

Model/Collection cleanup

Page 34: TiConnect: Memory Management in Titanium apps

Speaking of, just don’t...

Page 35: TiConnect: Memory Management in Titanium apps

Well, at least do a good job...

Page 36: TiConnect: Memory Management in Titanium apps

Remember the basics: don’t create variables unnecessarily

Page 37: TiConnect: Memory Management in Titanium apps

Remember the basics: clean up after yourself

Page 38: TiConnect: Memory Management in Titanium apps

Remember the basics: even if you have to get tricky

Page 39: TiConnect: Memory Management in Titanium apps

Profiling and testing

github.com/skypanther/LeakyApp

Page 40: TiConnect: Memory Management in Titanium apps

Instruments

Page 41: TiConnect: Memory Management in Titanium apps

Instruments

Page 42: TiConnect: Memory Management in Titanium apps

Monitor

Page 43: TiConnect: Memory Management in Titanium apps

Monitor, almost useful...

Page 44: TiConnect: Memory Management in Titanium apps

Takeaways

Limit images, lazy load, use fonts ...I love trash (aka: code with GC in mind)

Let Alloy do its stuffBut clean up after yourself

Profile your apps

Page 45: TiConnect: Memory Management in Titanium apps

Thank YouTIM POULSEN@skypanther