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
ああうえ
September 20, 2025
Programming
2.3k
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.2k
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
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
530
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
180
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.3k
Java 27新機能 / Java 27 new features
kishida
2
190
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.4k
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.3k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
110
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.3k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
6.1k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
464
34k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
430
Agile that works and the tools we love
rasmusluckow
331
22k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
Code Reviewing Like a Champion
maltzj
528
40k
Prompt Engineering for Job Search
mfonobong
0
480
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
How to make the Groovebox
asonas
2
2.5k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
380
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
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 ϝϞϦෆͱͷઓ͍ʙେྔσʔλΛѻ͏ΞϓϦͰͷ࣮ફྫʙʛ͋͋͏͑