Professional Documents
Culture Documents
Session 416
© 2018 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
•
Memory footprint
•
Images
•
Demo
•
Memory Footprint
•
UIView
String UILabel
Memory Footprint
Pages
UIView
Data
String UILabel
Memory Footprint
Pages
Typically 16KB
Page types
• Clean
• Dirty
Memory Footprint
Pages
Typically 16KB
Page types
• Clean
• Dirty
32
Memory Footprint
Clean and dirty pages
32
64
Memory Footprint
Memory mapped files
File-backed memory
50KB
Memory Footprint
Memory mapped files
50KB
Memory Footprint
Typical app memory profile
Dirty
Compressed
Clean
Memory Footprint
Clean memory
Clean
Memory
Memory Footprint
Clean memory
Clean
Memory
Memory Footprint
Clean memory
Blob.data Clean
Memory
Training.model
Memory Footprint
Clean memory
Frameworks* __DATA_CONST
Clean
Memory
CoreGraphics
__DATA_CONST
Memory Footprint
Dirty memory
Memory Footprint
Dirty memory
Dirty
Memory
Memory Footprint
Dirty memory
Dirty
Memory
Memory Footprint
Dirty memory
Array
Dirty
NSCache
Memory
UIViews
String
Memory Footprint
Dirty memory
Dirty
Memory
ImageIO
Memory Footprint
Dirty memory
Frameworks Dirty
CoreGraphics Memory
__DATA
__DATA_DIRTY
Memory Footprint
Frameworks
Singletons
Global initializers
+(void)load; // Objective-C
+(void)initialize; // Objective-C
__attribute__((constructor)) // Objective-C
initialize(); // Swift
Memory Footprint
Compressed memory
Memory compressor
• Compresses unaccessed pages
Memory compressor
• Compresses unaccessed pages
Memory compressor
• Compresses unaccessed
stale pages pages
• Decompresses pages upon access
Dirty
Compressed
Clean
Memory Footprint
Typical app memory profile
Dirty
Compressed
Clean
Memory Footprint
Typical app memory profile
Footprint
Dirty
Compressed
Clean
Memory Footprint
Typical app memory profile
Dirty
Compressed
Clean
Memory Footprint
Typical app memory profile
Dirty
Compressed
Clean
Memory Footprint
Typical app memory profile
Compressed
Clean
Memory Footprint
Typical app memory profile
Compressed
Clean
Memory Footprint
Typical app memory profile
Clean
Memory Footprint
Typical app memory profile
Clean
•
Allocations
Leaks
VM Tracker
vmmap App.memgraph
vmmap --summary App.memgraph
Tools for Profiling Footprint
vmmap --summary App.memgraph
Tools for Profiling Footprint
vmmap --summary App.memgraph
Tools for Profiling Footprint
vmmap --summary App.memgraph
Tools for Profiling Footprint
vmmap --summary App.memgraph
Tools for Profiling Footprint Zoom and focus
vmmap App.memgraph
Tools for Profiling Footprint Zoom and focus
vmmap App.memgraph
Tools for Profiling Footprint
vmmap App.memgraph
Tools for Profiling Footprint
vmmap App.memgraph
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint
vmmap and AWK
Tools for Profiling Footprint NEW
leaks
leaks App.memgraph
Tools for Profiling Footprint
leaks
Tools for Profiling Footprint
leaks
Tools for Profiling Footprint NEW
leaks MyApp.memgraph
Tools for Profiling Footprint NEW
leaks MyApp.memgraph
Tools for Profiling Footprint NEW
leaks MyApp.memgraph
Tools for Profiling Footprint NEW
leaks MyApp.memgraph
Tools for Profiling Footprint NEW
heap
heap App.memgraph
heap App.memgraph -sortBySize
heap App.memgraph -addresses all | <classes-pattern>
Tools for Profiling Footprint
heap App.memgraph
Tools for Profiling Footprint
heap App.memgraph
Tools for Profiling Footprint
heap App.memgraph
Tools for Profiling Footprint
heap App.memgraph
Tools for Profiling Footprint
heap App.memgraph
Tools for Profiling Footprint
heap --sortBySize App.memgraph
Tools for Profiling Footprint
heap --sortBySize App.memgraph
Tools for Profiling Footprint
heap App.memgraph -addresses all | <classes-pattern>
Tools for Profiling Footprint
heap App.memgraph -addresses all | <classes-pattern>
Tools for Profiling Footprint
Enabling malloc stack logging
Tools for Profiling Footprint
Enabling malloc stack logging
Tools for Profiling Footprint NEW
malloc_history
malloc_history
Tools for Profiling Footprint
Which tool to pick?
malloc_history leaks
Tools for Profiling Footprint
Which tool to pick?
Images
1536px
Load
590Kb
Images
Load Decode
590KB 10MB
Images
590KB 10MB
SRGB Format
• Four bytes per pixel
Wide format
• Eight bytes per pixel
• Metal shaders
Images
Image rendering formats
Alpha 8 Format
• One byte per pixel
- Masks
- Emoji-free text
• 75 percent smaller than SRGB
Images
Image rendering formats
// Drawing Code
UIColor.black.setFill()
let path = UIBezierPath(roundedRect: bounds,
byRoundingCorners: UIRectCorner.allCorners,
cornerRadii: CGSize(width: 20, height: 20))
path.addClip()
UIRectFill(bounds)
// Drawing Code
UIColor.black.setFill()
let path = UIBezierPath(roundedRect: bounds,
byRoundingCorners: UIRectCorner.allCorners,
cornerRadii: CGSize(width: 20, height: 20))
path.addClip()
UIRectFill(bounds)
ImageIO can read image sizes and metadata information without dirtying memory
import UIKit
// Resizing image
let scale = 0.2
let size = CGSize(image.size.width * scale, image.size.height * scale)
let renderer = UIGraphicsImageRenderer(size: size)
let resizedImage = renderer.image { context in
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
}
// Image size with UIImage
import UIKit
// Resizing image
let scale = 0.2
let size = CGSize(image.size.width * scale, image.size.height * scale)
let renderer = UIGraphicsImageRenderer(size: size)
let resizedImage = renderer.image { context in
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
}
// Image size with UIImage
import UIKit
// Resizing image
let scale = 0.2
let size = CGSize(image.size.width * scale, image.size.height * scale)
let renderer = UIGraphicsImageRenderer(size: size)
let resizedImage = renderer.image { context in
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
}
// Image size with ImageIO
import ImageIO
import ImageIO
import ImageIO
import ImageIO
App lifecycle
• Listen for UIApplicationWillEnterForeground and
UIApplicationDidEnterBackground notifications
• Applies to on-screen views
NotificationCenter.default.addObserver(forName: .UIApplicationDidEnterBackground,
object: nil,
queue: .main) { [weak self] (note) in
// Unload large resources when off-screen
self.unloadImages()
}
NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground,
object: nil,
queue:.main) { [weak self] (note) in
// Load large resources when off-screen
self.loadImages()
}
// Unloading resources on foreground/background
NotificationCenter.default.addObserver(forName: .UIApplicationDidEnterBackground,
object: nil,
queue: .main) { [weak self] (note) in
// Unload large resources when off-screen
self.unloadImages()
}
NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground,
object: nil,
queue:.main) { [weak self] (note) in
// Load large resources when off-screen
self.loadImages()
}
// Unloading resources on foreground/background
NotificationCenter.default.addObserver(forName: .UIApplicationDidEnterBackground,
object: nil,
queue: .main) { [weak self] (note) in
// Unload large resources when off-screen
self.unloadImages()
}
NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground,
object: nil,
queue:.main) { [weak self] (note) in
// Load large resources when off-screen
self.loadImages()
}
// Unloading resources on foreground/background
Demo