Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
ああうえ
September 20, 2025
Programming
2.4k
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
590
エンジニアとデザイナーがわかる iPadの画面サイズ対応入門
kwzr
0
210
react-reconcilerでオレオレReact Nativeを作ろう!
kwzr
1
3.3k
iOS・Androidで使える デザインシステムをどう実装するか
kwzr
3
5.9k
Apple Pencilと左利き対応
kwzr
5
2.7k
BitriseでUIの差分検出
kwzr
0
1.6k
CIをGASで継続的に改善したら幸せになった
kwzr
3
2k
Other Decks in Programming
See All in Programming
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
AmebaブログはKMPから卒業します
kmars0605
0
220
Simple Storage Service(S3) is not simple
iwatsukayura
0
320
R8 の設定見直しでアプリサイズ削減
andpad
0
230
Groovy as a human and AI friendly programming language
paulk
0
110
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
150
Railsバージョンを4倍にした話
optim
0
580
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
120
AI-Powered Domain-Driven Design
ziobrando
0
290
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
2.9k
sbt 2.0: takeoff
eed3si9n
0
170
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
240
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
640
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Visualization
eitanlees
153
17k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
740
How to Talk to Developers About Accessibility
jct
2
590
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.5k
Agile that works and the tools we love
rasmusluckow
331
22k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Navigating Team Friction
lara
192
16k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
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 ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑