0Pricing
Kotlin Academy · บทเรียน

การจัดการหน่วยความจำใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวม Kotlin/Native: เป้าหมาย ชุดเครื่องมือ และการคอมไพล์
  2. การจัดการหน่วยความจำใน Kotlin/Native: MM ใหม่
  3. การเชื่อมต่อกับ C ด้วย cinterop และไฟล์ .def
  4. Kotlin/WASM: การคอมไพล์เป็น WebAssembly สำหรับเบราว์เซอร์
← กลับไปที่ Kotlin Academy