การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่
สำรวจตัวจัดการหน่วยความจำใหม่ของ Kotlin/Native, GC และการเป็นเจ้าของออบเจ็กต์
การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาของแบบจำลองหน่วยความจำเดิม
แบบจำลองหน่วยความจำเดิมของ Kotlin/Native (ก่อน 1.7.20) ใช้แนวคิดว่าไม่เปลี่ยนแปลงเป็นค่าเริ่มต้น: ออบเจ็กต์ต้องถูกทำให้หยุดการเปลี่ยนแปลงก่อนข้ามขอบเขตเธรด ทำให้โค้ดหลายเธรดใช้งานยุ่งยากและไม่สอดคล้องกับความหมายการทำงานของโคโรทีน Kotlin
ตัวจัดการหน่วยความจำใหม่ (1.7.20 ขึ้นไป)
ตั้งแต่ Kotlin 1.7.20 เป็นต้นมา Kotlin/Native ใช้แบบจำลองหน่วยความจำใหม่ที่จัดการด้วยตัวเก็บขยะ ซึ่งมีพฤติกรรมสอดคล้องกับ JVM/JS อนุญาตให้กลายพันธุ์ออบเจ็กต์ข้ามเธรดได้เป็นค่าเริ่มต้น API freeze() / isFrozen ถูกเลิกใช้และไม่ดำเนินการใด ๆ
การออกแบบตัวเก็บขยะ
MM ใหม่ใช้ตัวเก็บขยะแบบ หยุดโลก ทำเครื่องหมายและกวาดล้าง ซึ่งทำงานบนเธรดตัวเก็บขยะที่แยกต่างหาก โดยมีเป้าหมายเพื่อลดเวลาหยุดชั่วคราวให้สั้นที่สุดและทำงานทีละส่วน รุ่นในอนาคตจะปรับปรุงกลยุทธ์ของตัวเก็บขยะต่อไป
โคโรทีนกับ MM ใหม่
เมื่อใช้ MM ใหม่ kotlinx.coroutines จะทำงานบน Kotlin/Native เหมือนกับบน JVM ทุกประการ คุณสามารถใช้สถานะที่เปลี่ยนแปลงได้ร่วมกันระหว่างโคโรทีนด้วยรูปแบบเดียวกัน (เช่น ฟิลด์ที่เปลี่ยนแปลงได้ซึ่งป้องกันด้วย Mutex) โดยไม่ต้องหยุดการเปลี่ยนแปลงของออบเจ็กต์
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }ความปลอดภัยของเธรดใน MM ใหม่
MM ใหม่ไม่ได้มอบความปลอดภัยของเธรดโดยอัตโนมัติ — คุณยังต้องซิงโครไนซ์สถานะที่เปลี่ยนแปลงได้ร่วมกันด้วยตนเองโดยใช้ Mutex, AtomicInt, AtomicReference หรือจำกัดสถานะให้อยู่ในเธรดเดียวผ่านตัวจัดส่งโคโรทีน
ชนิดอะตอมิกใน Kotlin/Native
ใช้ kotlin.native.concurrent.AtomicInt, AtomicLong, AtomicReference สำหรับการดำเนินการแบบอะตอมิกที่ไม่ใช้ล็อกกับค่าชนิดพื้นฐานและการอ้างอิง:
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueวงจรชีวิตของออบเจ็กต์และ ARC บนเป้าหมายของ Apple
บนแพลตฟอร์มของ Apple (iOS/macOS) Kotlin/Native ใช้ ARC (การนับจำนวนการอ้างอิงอัตโนมัติ) เพื่อทำงานร่วมกับออบเจ็กต์ Objective-C ออบเจ็กต์ที่ Kotlin เป็นเจ้าของจะได้รับการจัดการโดยตัวเก็บขยะ ส่วนออบเจ็กต์ ObjC/Swift ที่ส่งมายัง Kotlin จะเชื่อมผ่านตัวห่อหุ้มที่เข้ากันได้กับ ARC
หน่วยความจำรั่ว: สิ่งที่ควรเฝ้าระวัง
ปัญหาหน่วยความจำทั่วไปของ Native ได้แก่ วงจรการอ้างอิงระหว่างออบเจ็กต์ Kotlin กับตัวแทน/โคลเชอร์ของ ObjC กราฟออบเจ็กต์ขนาดใหญ่ที่ไม่ถูกปล่อยหลังใช้งาน และผู้ปฏิบัติงานเบื้องหลังที่มีอายุยาวนานซึ่งเก็บการอ้างอิงไปยังออบเจ็กต์ส่วนติดต่อผู้ใช้ ใช้ Xcode Instruments เพื่อวิเคราะห์ประสิทธิภาพบนเป้าหมายของ Apple
เธรดผู้ปฏิบัติงานเบื้องหลัง
ใช้ kotlin.native.concurrent.Worker สำหรับเธรดเบื้องหลังระดับแพลตฟอร์ม (หรือเลือกใช้โคโรทีนร่วมกับตัวจัดส่งเนทีฟ) Worker แต่ละตัวมีลูปเหตุการณ์ของตนเอง และสื่อสารผ่าน execute() ซึ่งจะถ่ายโอนหรือใช้ออบเจ็กต์ร่วมกันตามกฎของ MM ใหม่
การย้ายจาก MM เดิม
ลบการเรียกใช้ freeze(), ensureNeverFrozen() และ isFrozen ทั้งหมด แทนที่วิธีแก้ชั่วคราวด้วย AtomicReference โดยใช้คุณสมบัติที่เปลี่ยนแปลงได้ธรรมดาซึ่งป้องกันด้วย Mutex หากจำเป็น อัปเดต kotlinx.coroutines เป็น 1.6.4 ขึ้นไปเพื่อรองรับ MM ใหม่
การปรับแต่งตัวเก็บขยะ
สามารถปรับแต่งตัวเก็บขยะผ่านคุณสมบัติของระบบหรือตัวเลือกไบนารีของ Kotlin/Native สำหรับแอปที่ไวต่อเวลาแฝง ให้ทดลองใช้ kotlin.native.gc.collectIntervalMillis สำหรับอุปกรณ์ที่มีหน่วยความจำจำกัด ให้ลดขนาดฮีปด้วย kotlin.native.gc.heapTriggerCoefficient
แบบทดสอบสั้น ๆ
ตัวจัดการหน่วยความจำใหม่ของ Kotlin/Native (1.7.20 ขึ้นไป) นำการเปลี่ยนแปลงสำคัญอะไรมาใช้
สรุป: การจัดการหน่วยความจำใน Kotlin/Native
ประเด็นสำคัญ:
- MM ใหม่ (1.7.20 ขึ้นไป): จัดการด้วยตัวเก็บขยะ ออบเจ็กต์ที่เปลี่ยนแปลงได้สามารถใช้ร่วมกันข้ามเธรด และ
freeze()ไม่ดำเนินการใด ๆ - ยังคงต้องซิงโครไนซ์ด้วยตนเอง:
Mutex,AtomicInt,AtomicReference - เป้าหมายของ Apple ใช้ ARC สำหรับการทำงานร่วมกับ ObjC ส่วนออบเจ็กต์ Kotlin จัดการโดยตัวเก็บขยะ
- โคโรทีนทำงานเหมือนกับบน JVM ทุกประการใน MM ใหม่
- ลบการเรียกใช้
freeze()แบบเดิมเมื่อย้ายไปใช้ MM ใหม่
คำถามที่พบบ่อย
บทเรียน “การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่”
สำรวจตัวจัดการหน่วยความจำใหม่ของ Kotlin/Native, GC และการเป็นเจ้าของออบเจ็กต์ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวม Kotlin/Native: เป้าหมาย ชุดเครื่องมือ และการคอมไพล์
- การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่
- การเชื่อมต่อกับ C ด้วย cinterop และไฟล์ .def
- Kotlin/WASM: การคอมไพล์เป็น WebAssembly สำหรับเบราว์เซอร์