メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
by
ああうえ
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙ ϝϞϦෆͱͷઓ͍ ͋͋͏͑ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 2
Slide 2 text
• iOSΞϓϦΤϯδχΞ • झຯͰ͓ֆඳ͖ͳͲ • ࠷ۙɺ֎ϥΠϒͰMacͱ iPhone͕ήϦϥ߽ӍͰਫ ͋͋͏͑ 1BTUFMBʛQJYJW ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 3
Slide 3 text
• όΠφϦσʔλͷѻ͍ɺࣗ༝ͷߴ͍ೖྗ͕͋Δ • ྫ: ϖΠϯτπʔϧɺಈը੍࡞πʔϧɺϏδϡΞϥΠβɺήʔϜ… ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦ༻ྔͷଟ͍ΞϓϦ
Slide 4
Slide 4 text
ྫ: Pastela ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ 📱 iPad͚ϖΠϯτπʔϧ ✅ ΧελϚΠζੑ • ϒϥγ • UIஔ • γϣʔτΧοτ ✅ ϨΠϠʔ੍ݶͳ͠
Slide 5
Slide 5 text
ྫ: Pastela ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ 📱 iPad͚ϖΠϯτπʔϧ ✅ ΧελϚΠζੑ • ϒϥγ • UIஔ • γϣʔτΧοτ ✅ ϨΠϠʔ੍ݶͳ͠ ↑ʂʁ
Slide 6
Slide 6 text
• ϝϞϦ্Ͱඇѹॖ • ୯७ͳܭࢉྫ • 2000×2000px × 32bit(RGBA) × 200ϨΠϠʔ • ≈ 3.2GB ※࣮ࡍʹϨΠϠʔͷඞཁͳՕॴ͚ͩ֬อ͢ΔͷͰɺ͜Μͳʹଟ͘ͳ͍ • ͜ΕҎ֎ʹϛοϓϚοϓ৭ʑͳΩϟογϡͳͲ͕ଘࡏ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϨΠϠʔͷ֬อϝϞϦʹ͍ͭͯ
Slide 7
Slide 7 text
iOSͰϝϞϦΛ͍͗͢ΔͱͲ͏ͳΔ͔? • iPhone / iPadͷRAM: 2ʙ16GB • ͯ͑͢ΔΘ͚Ͱͳ͍ • γεςϜ͕ඞཁʹԠͯ͡ΞϓϦΛڧ੍ऴྃ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 8
Slide 8 text
iOSͰϝϞϦΛ͍ΔͱͲ͏ͳΔ͔? • ։ൃऀͷӨڹ • Ϋϥογϡϩά͕૿͑ɺຊདྷͷόάௐ͕ࠪࠔʹ • ϢʔβʔମݧͷѱԽ • ΞϓϦͷ࠶ىಈ͕ඞཁ • ࡞ۀ༰͕ࣦΘΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 9
Slide 9 text
ରࡦͷྫ • ϝϞϦϦʔΫΛແ͘͢ • Ϣʔβʔσʔλ͕ࣦΘΕͳ͍Α͏ʹอଘ͢Δ • ϝϞϦෆͰ͋Δ͜ͱΛϢʔβʔʹ͑Δ(ϝϞϦෆΞϥʔτ) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 10
Slide 10 text
ϝϞϦෆΞϥʔτͷෆࢥٞ • Ϋϥογϡ࣌ʹϝϞϦෆΞϥʔτ͕දࣔ͞Ε͍ͯͳ͍? • CrashlyticsͷΧελϜΩʔʹදࣔ͞Ε͍ͯΔ͔ه͍ͯͨ͠ • Ҏ্ͷϩάͰදࣔ͞Ε͍ͯͳ͍ఆ(Կނ…?) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 11
Slide 11 text
iOSͷϝϞϦʹ͍ͭͯΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 12
Slide 12 text
JetsamΠϕϯτ • γεςϜͷϝϞϦ༻ʹ͕͋Δ߹ʹΞϓϦʹૹΒΕͯ͘Δ • ૹΒΕͯ͘ΔͱΞϓϦ͕ڧ੍ऴྃ͞ΕΔ • iOSͷઃఆΞϓϦ͔ΒϩάΛऔಘՄೳ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Slide 13
Slide 13 text
JetsamΠϕϯτΛ֬ೝ͢Δ • .ipsϑΝΠϧ(JSONܗࣜ) • largestProcessΛ֬ೝ͢Δ • ࣗͷΞϓϦͰ͋ΕϝϞϦ༻ʹ͕͋ΔՄೳੑ • reason: ऴྃͨ͠ཧ༝(per-process-limit, vm-pageshortage, …) • rpages: ֬อ͞Ε͍ͯͨϖʔδɻpageSizeΛֻ͚Δͱ༻ྔʹ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Slide 14
Slide 14 text
ϝϞϦϫʔχϯά(didReceiveMemoryWarning) • UIKit • didReceiveMemoryWarning • SwiftUI • didReceiveMemoryWarningNoti fi cation • AppDelegate • applicationDidReceiveMemoryWarning(_:) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Slide 15
Slide 15 text
ϝϞϦϫʔχϯά(DispatchSource) • DispatchSourceMemoryPressure • normal / warning / critical • ෮چ࣌௨ͯ͘͠ΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ dispatchSource = DispatchSource.makeMemoryPressureSource(eventMask: .all) dispatchSource.setEventHandler { switch dispatchSource.data { case .normal: ... case .warning: ... case .critical: ... } } dispatchSource.activate() iOSͷϝϞϦʹ͍ͭͯΔ
Slide 16
Slide 16 text
ϝϞϦϫʔχϯάΛड͚औͬͨΒ • ΩϟογϡΛղ์ɾҰ࣌ఀࢭ • όοΫάϥϯυ࡞ۀΛ੍͢Δ • େنͳϝϞϦׂΓͯத؇͔ʹׂΓͯΔΑ͏ઓུΛมߋ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Slide 17
Slide 17 text
Memory Compression • iOS 7+ • iOSͰDisk SwapͰͳ͘Memory CompressionΛ࠾༻ iPadOS 16.1͔ΒVirtual Memory Swap͕༗ޮͳ͋Δ • ࠷ۙΞΫηεͷͳ͍DirtyͳϖʔδΛѹॖ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Slide 18
Slide 18 text
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JSUZ $MFBO iOS Memory Deep Dive - WWDC2018 $PNQSFTTFE iOSͷϝϞϦʹ͍ͭͯΔ
Slide 19
Slide 19 text
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUPOBSZ /4%BUB iOS Memory Deep Dive - WWDC2018 iOSͷϝϞϦʹ͍ͭͯΔ
Slide 20
Slide 20 text
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUJPOBSZ /4%BUB iOS Memory Deep Dive - WWDC2018 iOSͷϝϞϦʹ͍ͭͯΔ
Slide 21
Slide 21 text
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUPOBSZ /4%BUB iOS Memory Deep Dive - WWDC2018 ࠶ΞΫηε👀 iOSͷϝϞϦʹ͍ͭͯΔ
Slide 22
Slide 22 text
ϝϞϦϫʔχϯάͷਂ۷Γ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 23
Slide 23 text
ϝϞϦෆΞϥʔτ͕දࣔ͞Εͳ͍Λਪଌ • ϝϞϦϫʔχϯά͕ਖ਼͘͠ड͚औΕ͍ͯͳ͍? • ࠷ॳͷ࣮didReceiveMemoryWarningΛ༻ • ݹ͍ͰൃՐ͍͢͠ • ৽͠ΊͷͰൃՐͤͣʹڧ੍ऴྃ·Ͱߦ͘͜ͱ? • DispatchSourceMemoryPressureͳΒݕͰ͖Δ? • Apple Silicon൛iPadͳͲɺ৽͍ͩ͠ͱى͜Δ? ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 24
Slide 24 text
෦࣮Λ֬ೝʂ • Χʔωϧͷ࣮υΩϡϝϯτΛݟͯΈΔ • https://github.com/apple-oss-distributions/xnu • XNUmacOSɺiOSɺiPadOSͳͲͷΧʔωϧ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 25
Slide 25 text
ϝϞϦϫʔχϯάΛड͚औΔ࣮͕ѱ͍ͷ͔? • didReceiveMemoryWarning → DispatchSourceMemoryPressure • ࡉ͔͍ΠϕϯτΛड͚औΔΑ͏ʹͨ͠ΒมΘΔͷ͔? • ݁: ෦࣮͕ಉ͡ͳͨΊɺड͚औΔλΠϛϯάมΘΒͳ͍ • > Dispatch Sources • > UIKit further exposes handlers for App developers. See Responding to Low Memory Warnings. https://github.com/apple-oss-distributions/xnu/blob/rel/xnu-11417/doc/vm/memorystatus_notify.md • ͦͦɺυΩϡϝϯτʹϕετΤϑΥʔτͰൃՐ͢Δͱ͋Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 26
Slide 26 text
ͳͥϝϞϦϫʔχϯά͕ૹΒΕͯ͜ͳ͍͔? • ͳͥϝϞϦϫʔχϯάΑΓઌʹڧ੍ऴྃ͢Δ(Jetsam͕ݺΕΔ) ͜ͱ͕͋Δ? • → ఆํ๏͕ҧ͏͔Β ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 27
Slide 27 text
Jetsamͷఆ • ͍͔ͭ͘ͷஈ֊݅Ͱͷఆ͕͋Δ • https://github.com/apple-oss-distributions/xnu/blob/rel/ xnu-11417/doc/vm/memorystatus_kills.md • 13छྨ΄Ͳ • MEMORY_PERPROCESSLIMIT • ϓϩηεͰར༻Ͱ͖ΔϝϞϦ্ݶΛͬͨఆ • ͑Δͱଈkill͞ΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 28
Slide 28 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • Pressure Thresholds • https://github.com/apple-oss-distributions/xnu/blob/rel/ xnu-11417/doc/vm/memorystatus_notify.md#pressure- thresholds • warningͱcritical͕͋Δ͕ɺwarningͷఆͷΈհ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 29
Slide 29 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 30
Slide 30 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • ͬ͘͟ΓγεςϜͰར༻த + ར༻ՄೳͳϝϞϦϖʔδ • AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 31
Slide 31 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • γεςϜͰར༻Մೳͳ૯ϝϞϦϖʔδ • AVAILABLE_NON_COMPRESSED_MEMORY + compressed • compressed: γεςϜͰѹॖ͞Ε͍ͯΔϖʔδ(ѹॖޙ) • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 32
Slide 32 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD • 0.5 * AVAILABLE_MEMORY ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 33
Slide 33 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ boolean_t VM_PRESSURE_NORMAL_TO_WARNING(void) { if (!VM_CONFIG_COMPRESSOR_IS_ACTIVE) { ... } else { return (AVAILABLE_NON_COMPRESSED_MEMORY < VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD) ? 1 : 0; } } vm_pageout.c ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 34
Slide 34 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ boolean_t VM_PRESSURE_NORMAL_TO_WARNING(void) { if (!VM_CONFIG_COMPRESSOR_IS_ACTIVE) { ... } else { return (AVAILABLE_NON_COMPRESSED_MEMORY < VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD) ? 1 : 0; } } AVAILABLE_MEMORY - compressed vm_pageout.c ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 35
Slide 35 text
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ boolean_t VM_PRESSURE_NORMAL_TO_WARNING(void) { if (!VM_CONFIG_COMPRESSOR_IS_ACTIVE) { ... } else { return (AVAILABLE_NON_COMPRESSED_MEMORY < VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD) ? 1 : 0; } } 0.5 * AVAILABLE_MEMORY vm_pageout.c ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 36
Slide 36 text
ϝϞϦϫʔχϯάͷఆ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVL_MEMORY - compressed < AVL_MEMORY * 0.5 ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 37
Slide 37 text
ϝϞϦϫʔχϯάͷఆ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVL_MEMORY - compressed < AVL_MEMORY * 0.5 • compressed > AVL_MEMORY * 0.5 • γεςϜͰར༻Մೳͳ૯ϝϞϦͷ50%ΑΓcompressed͕ଟ͍ͱ ൃՐ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 38
Slide 38 text
ͷRAMͱϝϞϦϫʔχϯά ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • compressed > AVL_MEMORY * 0.5 • RAM͕େ͖͍ͱAVL_MEMORYͷେ͖͍ • ૬ରతʹWarningఆ͞ΕͮΒ͍ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 39
Slide 39 text
compressedͱϝϞϦϫʔχϯά ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • compressed > AVL_MEMORY * 0.5 • compressedͷ͕খ͍͞ͱ૬ରతʹWarningఆ͞ΕͮΒ͍ ϝϞϦϫʔχϯάͷਂ۷Γ
Slide 40
Slide 40 text
ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ θϩϑΟϧ ϥϯμϜϑΟϧ
Slide 41
Slide 41 text
ϖΠϯτπʔϧͷಛੑͱϝϞϦѹॖ • ϝϞϦ্ʹ࿈ଓ͕ͨ͠ଟ͍ • ۭന෦ɺಉ৭͕ଓ͖ɺѹॖ͍͢͠σʔλ • ϝϞϦѹॖ͕ޮ͍ͯɺϝϞϦϫʔχϯά͕ൃՐ͞ΕͮΒ͍ʂʂ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ಉ͡ϐΫηϧ͕࿈ଓ
Slide 42
Slide 42 text
os_proc_available_memory • iOS 13+ • ϓϩηεͰར༻Ͱ͖ΔΓͷϝϞϦྔΛऔಘ • σϑΥϧτͷঢ়ଶͰiPhone 16 ProͰ3GB΄Ͳ • 0ʹͳΔͱJetsamʹΑͬͯڧ੍ऴྃ • (γϛϡϨʔλʔͰৗʹ0Λฦ͢) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 43
Slide 43 text
PastelaͷϝϞϦෆఆΛมߋ • os_proc_available_memory()ͷ͕ҰఆΛԼճͬͨΒϝϞϦෆ ΞϥʔτΛग़͢Α͏ʹ • ϝϞϦѹॖΛؾʹͤͣఆͰ͖ΔΑ͏ʹʂ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 44
Slide 44 text
ԾΞυϨεۭؒͷෆʹରॲ͢Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 45
Slide 45 text
Extended Virtual Addressing Entitlement • iOS 14+ • ΞϓϦʹׂΓͯΒΕΔԾΞυϨεۭ͕͕ؒΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ແޮ࣌ ༗ޮ࣌ iPhone 16 ProͰͷ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Slide 46
Slide 46 text
Increased Memory Limit • iOS 15+ • ϓϩηεͰར༻Ͱ͖ΔϝϞϦྔΛ૿͢͜ͱ͕Ͱ͖Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ແޮ࣌ ༗ޮ࣌ iPhone 16 ProͰͷ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Slide 47
Slide 47 text
Extended Virtual AddressingΛ༗ޮʹ͢Δͱ? • ΞϓϦʹׂΓͯΒΕΔԾΞυϨεۭ͕͕ؒΔ • Ͳͷ͘Β͍? ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Slide 48
Slide 48 text
ԾΞυϨεۭؒͷϨΠΞτ(EVAແޮ࣌) • ώʔϓmmap༻ͷྖҬݶΒΕ͍ͯΔ • εϖοΫʹΑΔ͕ɺେମ3ʙ9GB͘Β͍ • ࣌ؒ͏ΞϓϦͩͱஅยԽʹΑͬͯbad_alloc͕ى͖͍͢ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Slide 49
Slide 49 text
ԾΞυϨεۭؒͷϨΠΞτ(EVA༗ޮ࣌) • ώʔϓmmap༻ͷྖҬ͕֨ஈʹ͘ • அยԽͷ͕ى͜ΓͮΒ͘ͳΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Slide 50
Slide 50 text
🎉
Slide 51
Slide 51 text
·ͱΊ • Χʔωϧͷ࣮ΛಡΜͩΒશ෦ॻ͍ͯ͋ͬͨ • ϝϞϦϫʔχϯάͱJetsamΠϕϯτͷఆํ๏ผ • ͷRAMʹΑͬͯϝϞϦϫʔχϯάͷൃՐ͕͢͠͞มԽ • ϖΠϯτπʔϧͰϝϞϦѹॖ͕ى͜Γ͍͢σʔλΛѻͬͯ ͓ΓɺϝϞϦϫʔχϯά͕ൃՐͮ͠Β͍ • Extended Virtual AddressingΛ༗ޮʹ͢ΔͱஅยԽʹΑΔ͕ ى͜ΓͮΒ͘ͳΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 52
Slide 52 text
Tips: Firebase CrashlyticsͷRAMۭ͖༰ྔ • Tips: Firebase Crashlyticsͷʮσʔλ > RAMۭ͖༰ྔʯγες ϜͷཧϝϞϦͷۭ͖༰ྔ • ΞϓϦͰvm_statistics64ͷfree_count * page_sizeͰऔಘ • ීஈϝϞϦ༻ྔͷগͳ͍ΞϓϦͰϝϞϦϦʔΫ͕ਪଌՄೳ • ଟ͘ͷϝϞϦΛ͏ΞϓϦͰ͋·Γҙຯͷͳ͍ • RAMۭ͖༰ྔ͕গͳͯ͘εϫοϓѹॖͰղܾ͞ΕΔՄೳੑ ͕͋ΔͨΊ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Slide 53
Slide 53 text
ࢀߟ • Responding to low-memory warnings - Apple Developer • apple-oss-distributions/xnu • iOS Memory Deep Dive - WWDC18 • Detect and diagnose memory issues - WWDC21 • Analyze heap memory - WWDC24 ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑