Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
Search
ああうえ
September 20, 2025
Programming
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
https://fortee.jp/iosdc-japan-2025/proposal/755923cf-888f-4c71-a082-685dcb48b8aa
ああうえ
September 20, 2025
More Decks by ああうえ
See All by ああうえ
iOS Apple Dev Tutorialsとpointfreeのモダン実装を比較する
kwzr
1
560
エンジニアとデザイナーがわかる iPadの画面サイズ対応入門
kwzr
0
200
react-reconcilerでオレオレReact Nativeを作ろう!
kwzr
1
3.1k
iOS・Androidで使える デザインシステムをどう実装するか
kwzr
3
5.9k
Apple Pencilと左利き対応
kwzr
5
2.6k
BitriseでUIの差分検出
kwzr
0
1.6k
CIをGASで継続的に改善したら幸せになった
kwzr
3
1.9k
Other Decks in Programming
See All in Programming
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
270
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
Contextとはなにか
chiroruxx
1
330
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
200
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
560
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
290
RTSPクライアントを自作してみた話
simotin13
0
610
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.2k
CSC307 Lecture 17
javiergs
PRO
0
320
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Being A Developer After 40
akosma
91
590k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
How to Ace a Technical Interview
jacobian
281
24k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Transcript
ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙ ϝϞϦෆͱͷઓ͍ ͋͋͏͑ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
• iOSΞϓϦΤϯδχΞ • झຯͰ͓ֆඳ͖ͳͲ • ࠷ۙɺ֎ϥΠϒͰMacͱ iPhone͕ήϦϥ߽ӍͰਫ ͋͋͏͑ 1BTUFMBʛQJYJW
ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
• όΠφϦσʔλͷѻ͍ɺࣗ༝ͷߴ͍ೖྗ͕͋Δ • ྫ: ϖΠϯτπʔϧɺಈը੍࡞πʔϧɺϏδϡΞϥΠβɺήʔϜ… ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦ༻ྔͷଟ͍ΞϓϦ
ྫ: Pastela ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ 📱 iPad͚ϖΠϯτπʔϧ ✅ ΧελϚΠζੑ • ϒϥγ
• UIஔ • γϣʔτΧοτ ✅ ϨΠϠʔ੍ݶͳ͠
ྫ: Pastela ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ 📱 iPad͚ϖΠϯτπʔϧ ✅ ΧελϚΠζੑ • ϒϥγ
• UIஔ • γϣʔτΧοτ ✅ ϨΠϠʔ੍ݶͳ͠ ↑ʂʁ
• ϝϞϦ্Ͱඇѹॖ • ୯७ͳܭࢉྫ • 2000×2000px × 32bit(RGBA) × 200ϨΠϠʔ
• ≈ 3.2GB ※࣮ࡍʹϨΠϠʔͷඞཁͳՕॴ͚ͩ֬อ͢ΔͷͰɺ͜Μͳʹଟ͘ͳ͍ • ͜ΕҎ֎ʹϛοϓϚοϓ৭ʑͳΩϟογϡͳͲ͕ଘࡏ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϨΠϠʔͷ֬อϝϞϦʹ͍ͭͯ
iOSͰϝϞϦΛ͍͗͢ΔͱͲ͏ͳΔ͔? • iPhone / iPadͷRAM: 2ʙ16GB • ͯ͑͢ΔΘ͚Ͱͳ͍ • γεςϜ͕ඞཁʹԠͯ͡ΞϓϦΛڧ੍ऴྃ
ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
iOSͰϝϞϦΛ͍ΔͱͲ͏ͳΔ͔? • ։ൃऀͷӨڹ • Ϋϥογϡϩά͕૿͑ɺຊདྷͷόάௐ͕ࠪࠔʹ • ϢʔβʔମݧͷѱԽ • ΞϓϦͷ࠶ىಈ͕ඞཁ •
࡞ۀ༰͕ࣦΘΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ରࡦͷྫ • ϝϞϦϦʔΫΛແ͘͢ • Ϣʔβʔσʔλ͕ࣦΘΕͳ͍Α͏ʹอଘ͢Δ • ϝϞϦෆͰ͋Δ͜ͱΛϢʔβʔʹ͑Δ(ϝϞϦෆΞϥʔτ) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ϝϞϦෆΞϥʔτͷෆࢥٞ • Ϋϥογϡ࣌ʹϝϞϦෆΞϥʔτ͕දࣔ͞Ε͍ͯͳ͍? • CrashlyticsͷΧελϜΩʔʹදࣔ͞Ε͍ͯΔ͔ه͍ͯͨ͠ • Ҏ্ͷϩάͰදࣔ͞Ε͍ͯͳ͍ఆ(Կނ…?) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
iOSͷϝϞϦʹ͍ͭͯΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
JetsamΠϕϯτ • γεςϜͷϝϞϦ༻ʹ͕͋Δ߹ʹΞϓϦʹૹΒΕͯ͘Δ • ૹΒΕͯ͘ΔͱΞϓϦ͕ڧ੍ऴྃ͞ΕΔ • iOSͷઃఆΞϓϦ͔ΒϩάΛऔಘՄೳ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
JetsamΠϕϯτΛ֬ೝ͢Δ • .ipsϑΝΠϧ(JSONܗࣜ) • largestProcessΛ֬ೝ͢Δ • ࣗͷΞϓϦͰ͋ΕϝϞϦ༻ʹ͕͋ΔՄೳੑ • reason: ऴྃͨ͠ཧ༝(per-process-limit,
vm-pageshortage, …) • rpages: ֬อ͞Ε͍ͯͨϖʔδɻpageSizeΛֻ͚Δͱ༻ྔʹ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
ϝϞϦϫʔχϯά(didReceiveMemoryWarning) • UIKit • didReceiveMemoryWarning • SwiftUI • didReceiveMemoryWarningNoti fi
cation • AppDelegate • applicationDidReceiveMemoryWarning(_:) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
ϝϞϦϫʔχϯά(DispatchSource) • DispatchSourceMemoryPressure • normal / warning / critical •
෮چ࣌௨ͯ͘͠ΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ dispatchSource = DispatchSource.makeMemoryPressureSource(eventMask: .all) dispatchSource.setEventHandler { switch dispatchSource.data { case .normal: ... case .warning: ... case .critical: ... } } dispatchSource.activate() iOSͷϝϞϦʹ͍ͭͯΔ
ϝϞϦϫʔχϯάΛड͚औͬͨΒ • ΩϟογϡΛղ์ɾҰ࣌ఀࢭ • όοΫάϥϯυ࡞ۀΛ੍͢Δ • େنͳϝϞϦׂΓͯத؇͔ʹׂΓͯΔΑ͏ઓུΛมߋ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Memory Compression • iOS 7+ • iOSͰDisk SwapͰͳ͘Memory CompressionΛ࠾༻ iPadOS
16.1͔ΒVirtual Memory Swap͕༗ޮͳ͋Δ • ࠷ۙΞΫηεͷͳ͍DirtyͳϖʔδΛѹॖ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ iOSͷϝϞϦʹ͍ͭͯΔ
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JSUZ $MFBO iOS Memory Deep Dive
- WWDC2018 $PNQSFTTFE iOSͷϝϞϦʹ͍ͭͯΔ
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUPOBSZ /4%BUB iOS Memory Deep Dive
- WWDC2018 iOSͷϝϞϦʹ͍ͭͯΔ
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUJPOBSZ /4%BUB iOS Memory Deep Dive
- WWDC2018 iOSͷϝϞϦʹ͍ͭͯΔ
Memory Compression ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ %JDUPOBSZ /4%BUB iOS Memory Deep Dive
- WWDC2018 ࠶ΞΫηε👀 iOSͷϝϞϦʹ͍ͭͯΔ
ϝϞϦϫʔχϯάͷਂ۷Γ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ϝϞϦෆΞϥʔτ͕දࣔ͞Εͳ͍Λਪଌ • ϝϞϦϫʔχϯά͕ਖ਼͘͠ड͚औΕ͍ͯͳ͍? • ࠷ॳͷ࣮didReceiveMemoryWarningΛ༻ • ݹ͍ͰൃՐ͍͢͠ • ৽͠ΊͷͰൃՐͤͣʹڧ੍ऴྃ·Ͱߦ͘͜ͱ? •
DispatchSourceMemoryPressureͳΒݕͰ͖Δ? • Apple Silicon൛iPadͳͲɺ৽͍ͩ͠ͱى͜Δ? ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
෦࣮Λ֬ೝʂ • Χʔωϧͷ࣮υΩϡϝϯτΛݟͯΈΔ • https://github.com/apple-oss-distributions/xnu • XNUmacOSɺiOSɺiPadOSͳͲͷΧʔωϧ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάΛड͚औΔ࣮͕ѱ͍ͷ͔? • 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 • ͦͦɺυΩϡϝϯτʹϕετΤϑΥʔτͰൃՐ͢Δͱ͋Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
ͳͥϝϞϦϫʔχϯά͕ૹΒΕͯ͜ͳ͍͔? • ͳͥϝϞϦϫʔχϯάΑΓઌʹڧ੍ऴྃ͢Δ(Jetsam͕ݺΕΔ) ͜ͱ͕͋Δ? • → ఆํ๏͕ҧ͏͔Β ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
Jetsamͷఆ • ͍͔ͭ͘ͷஈ֊݅Ͱͷఆ͕͋Δ • https://github.com/apple-oss-distributions/xnu/blob/rel/ xnu-11417/doc/vm/memorystatus_kills.md • 13छྨ΄Ͳ • MEMORY_PERPROCESSLIMIT
• ϓϩηεͰར༻Ͱ͖ΔϝϞϦ্ݶΛͬͨఆ • ͑Δͱଈkill͞ΕΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • Pressure Thresholds • https://github.com/apple-oss-distributions/xnu/blob/rel/ xnu-11417/doc/vm/memorystatus_notify.md#pressure- thresholds
• warningͱcritical͕͋Δ͕ɺwarningͷఆͷΈհ ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • ͬ͘͟ΓγεςϜͰར༻த + ར༻ՄೳͳϝϞϦϖʔδ •
AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • γεςϜͰར༻Մೳͳ૯ϝϞϦϖʔδ •
AVAILABLE_NON_COMPRESSED_MEMORY + compressed • compressed: γεςϜͰѹॖ͞Ε͍ͯΔϖʔδ(ѹॖޙ) • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(warning) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVAILABLE_NON_COMPRESSED_MEMORY • AVAILABLE_MEMORY • VM_PAGE_COMPRESSOR_COMPACT_THRESHOLD •
0.5 * AVAILABLE_MEMORY ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(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 ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(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 ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷᮢ(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 ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷఆ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVL_MEMORY - compressed < AVL_MEMORY *
0.5 ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦϫʔχϯάͷఆ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • AVL_MEMORY - compressed < AVL_MEMORY *
0.5 • compressed > AVL_MEMORY * 0.5 • γεςϜͰར༻Մೳͳ૯ϝϞϦͷ50%ΑΓcompressed͕ଟ͍ͱ ൃՐ ϝϞϦϫʔχϯάͷਂ۷Γ
ͷRAMͱϝϞϦϫʔχϯά ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • compressed > AVL_MEMORY * 0.5 •
RAM͕େ͖͍ͱAVL_MEMORYͷେ͖͍ • ૬ରతʹWarningఆ͞ΕͮΒ͍ ϝϞϦϫʔχϯάͷਂ۷Γ
compressedͱϝϞϦϫʔχϯά ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ • compressed > AVL_MEMORY * 0.5 •
compressedͷ͕খ͍͞ͱ૬ରతʹWarningఆ͞ΕͮΒ͍ ϝϞϦϫʔχϯάͷਂ۷Γ
ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ θϩϑΟϧ ϥϯμϜϑΟϧ
ϖΠϯτπʔϧͷಛੑͱϝϞϦѹॖ • ϝϞϦ্ʹ࿈ଓ͕ͨ͠ଟ͍ • ۭന෦ɺಉ৭͕ଓ͖ɺѹॖ͍͢͠σʔλ • ϝϞϦѹॖ͕ޮ͍ͯɺϝϞϦϫʔχϯά͕ൃՐ͞ΕͮΒ͍ʂʂ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ಉ͡ϐΫηϧ͕࿈ଓ
os_proc_available_memory • iOS 13+ • ϓϩηεͰར༻Ͱ͖ΔΓͷϝϞϦྔΛऔಘ • σϑΥϧτͷঢ়ଶͰiPhone 16 ProͰ3GB΄Ͳ
• 0ʹͳΔͱJetsamʹΑͬͯڧ੍ऴྃ • (γϛϡϨʔλʔͰৗʹ0Λฦ͢) ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
PastelaͷϝϞϦෆఆΛมߋ • os_proc_available_memory()ͷ͕ҰఆΛԼճͬͨΒϝϞϦෆ ΞϥʔτΛग़͢Α͏ʹ • ϝϞϦѹॖΛؾʹͤͣఆͰ͖ΔΑ͏ʹʂ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ԾΞυϨεۭؒͷෆʹରॲ͢Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Extended Virtual Addressing Entitlement • iOS 14+ • ΞϓϦʹׂΓͯΒΕΔԾΞυϨεۭ͕͕ؒΔ
ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ແޮ࣌ ༗ޮ࣌ iPhone 16 ProͰͷ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Increased Memory Limit • iOS 15+ • ϓϩηεͰར༻Ͱ͖ΔϝϞϦྔΛ૿͢͜ͱ͕Ͱ͖Δ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ແޮ࣌ ༗ޮ࣌ iPhone 16 ProͰͷ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
Extended Virtual AddressingΛ༗ޮʹ͢Δͱ? • ΞϓϦʹׂΓͯΒΕΔԾΞυϨεۭ͕͕ؒΔ • Ͳͷ͘Β͍? ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
ԾΞυϨεۭؒͷϨΠΞτ(EVAແޮ࣌) • ώʔϓmmap༻ͷྖҬݶΒΕ͍ͯΔ • εϖοΫʹΑΔ͕ɺେମ3ʙ9GB͘Β͍ • ࣌ؒ͏ΞϓϦͩͱஅยԽʹΑͬͯbad_alloc͕ى͖͍͢ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
ԾΞυϨεۭؒͷϨΠΞτ(EVA༗ޮ࣌) • ώʔϓmmap༻ͷྖҬ͕֨ஈʹ͘ • அยԽͷ͕ى͜ΓͮΒ͘ͳΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑ ԾΞυϨεۭؒͷෆʹରॲ͢Δ
🎉
·ͱΊ • Χʔωϧͷ࣮ΛಡΜͩΒશ෦ॻ͍ͯ͋ͬͨ • ϝϞϦϫʔχϯάͱJetsamΠϕϯτͷఆํ๏ผ • ͷRAMʹΑͬͯϝϞϦϫʔχϯάͷൃՐ͕͢͠͞มԽ • ϖΠϯτπʔϧͰϝϞϦѹॖ͕ى͜Γ͍͢σʔλΛѻͬͯ ͓ΓɺϝϞϦϫʔχϯά͕ൃՐͮ͠Β͍
• Extended Virtual AddressingΛ༗ޮʹ͢ΔͱஅยԽʹΑΔ͕ ى͜ΓͮΒ͘ͳΔ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
Tips: Firebase CrashlyticsͷRAMۭ͖༰ྔ • Tips: Firebase Crashlyticsͷʮσʔλ > RAMۭ͖༰ྔʯγες ϜͷཧϝϞϦͷۭ͖༰ྔ
• ΞϓϦͰvm_statistics64ͷfree_count * page_sizeͰऔಘ • ීஈϝϞϦ༻ྔͷগͳ͍ΞϓϦͰϝϞϦϦʔΫ͕ਪଌՄೳ • ଟ͘ͷϝϞϦΛ͏ΞϓϦͰ͋·Γҙຯͷͳ͍ • RAMۭ͖༰ྔ͕গͳͯ͘εϫοϓѹॖͰղܾ͞ΕΔՄೳੑ ͕͋ΔͨΊ ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑
ࢀߟ • 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 ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑