0Pricing
Python Academy · Pelajaran

Pengumpul Sampah dan Referensi Siklik

Pelajari cara modul gc menangani siklus referensi.

Pengumpul Sampah dan Referensi Siklik adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Mengapa Penghitungan Referensi Tidak Cukup

Penghitungan referensi tidak dapat mengumpulkan objek yang terlibat dalam siklus referensi—masing-masing menyimpan referensi ke objek lainnya, sehingga tidak ada jumlah yang turun menjadi 0.

# Reference cycle: a → b → a
a = {}
b = {"other": a}
a["other"] = b
del a, b
# Both objects are unreachable but refcount > 0
# Only the cyclic GC can collect them

Modul gc

gc adalah pengumpul sampah siklik. Modul ini secara berkala memindai objek yang dilacak untuk menemukan siklus yang tidak terjangkau dan mengumpulkannya.

import gc

gc.collect()   # trigger immediately
print(gc.garbage)   # objects with __del__ in cycles (cannot auto-collect)

Pengumpulan Berdasarkan Generasi

GC menggunakan tiga generasi. Objek baru dimulai pada generasi 0. Objek yang bertahan dari pengumpulan akan dipromosikan. Generasi 0 dikumpulkan paling sering.

import gc

print(gc.get_count())     # (gen0, gen1, gen2) allocations since last collection
print(gc.get_threshold()) # (700, 10, 10) — thresholds for each generation
gc.set_threshold(1000, 15, 10)  # tune

Mendeteksi Siklus dengan gc.get_referents

Periksa objek mana yang dirujuk oleh suatu objek—hal ini berguna untuk memahami alasan sesuatu tidak dikumpulkan.

import gc

a = []
b = [a]
a.append(b)

for ref in gc.get_referents(a):
    print(ref)   # shows b

gc.get_objects()

gc.get_objects() mengembalikan semua objek yang saat ini dilacak oleh GC. Ini berguna untuk menemukan kebocoran memori.

import gc

before = len(gc.get_objects())
create_lots_of_objects()
after = len(gc.get_objects())
print(f"Leaked: {after - before} objects")

Menghindari Siklus

Rancang struktur data untuk menghindari siklus: gunakan referensi lemah untuk referensi balik, gunakan pengenal alih-alih referensi langsung, atau putuskan siklus secara eksplisit sebelum objek keluar dari cakupan.

import weakref

class Node:
    def __init__(self, parent):
        # weakref avoids cycle:
        self.parent = weakref.ref(parent)

class Tree:
    def __init__(self):
        self.child = Node(self)   # no hard cycle

__del__ dan Siklus

Objek dengan __del__ yang terlibat dalam suatu siklus tidak dapat dikumpulkan secara otomatis. Objek tersebut ditempatkan di gc.garbage.

import gc

class Leaky:
    def __del__(self): pass

a = Leaky()
b = Leaky()
a.other = b
b.other = a
del a, b

gc.collect()
print(gc.garbage)   # [Leaky, Leaky] — cannot collect

gc.freeze() — Python 3.7+

gc.freeze() membekukan objek yang saat ini dilacak sehingga objek tersebut tidak pernah dikumpulkan. Ini berguna dalam proses yang berjalan lama setelah inisialisasi untuk mengurangi jeda GC.

import gc

# After all globals and imports are in place:
gc.freeze()   # no GC scanning for these objects ever again

# Useful for: gunicorn pre-fork, background servers

Menonaktifkan dan Mengaktifkan Kembali GC

Nonaktifkan GC siklik dalam perulangan ketat saat Anda mengetahui bahwa tidak ada siklus, lalu aktifkan kembali dan paksa pengumpulan setelahnya.

import gc

gc.disable()
try:
    result = tight_loop_no_cycles()
finally:
    gc.enable()
    gc.collect()

isenabled dan isfinalized

Periksa status GC dengan gc.isenabled() dan deteksi apakah suatu objek sedang difinalisasi dengan gc.is_finalized(obj).

import gc

print(gc.isenabled())      # True by default
obj = object()
print(gc.is_finalized(obj))  # False (still alive)

Pola Kebocoran Memori

Penyebab umum kebocoran memori Python: tembolok global yang terus bertambah tanpa batas, pendengar peristiwa yang tidak dilepaskan, referensi siklik dengan __del__, dan ekstensi C yang membocorkan referensi.

# Typical leaks:
global_cache = {}   # grows forever — use lru_cache with maxsize

class EventBus:
    listeners = []
    # Listeners hold references to objects:
    # @classmethod
    # def on(cls, fn): cls.listeners.append(fn)
    # Must call off() to detach

Pemeriksaan Singkat

Apa yang terjadi pada objek dengan __del__ yang terlibat dalam siklus referensi?

Ringkasan

GC siklik menangani siklus referensi yang tidak dapat ditangani oleh penghitungan referensi. GC ini menggunakan tiga generasi dan mempromosikan objek yang bertahan. Hindari siklus dengan referensi lemah. Objek dengan __del__ dalam siklus ditempatkan di gc.garbage. Gunakan gc.freeze() setelah inisialisasi untuk mengurangi jeda GC pada server yang berjalan lama.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengumpul Sampah dan Referensi Siklik” gratis?

Ya — teks lengkap “Pengumpul Sampah dan Referensi Siklik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pengumpul Sampah dan Referensi Siklik”?

Pelajari cara modul gc menangani siklus referensi. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Pengumpul Sampah dan Referensi Siklik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penghitungan Referensi CPython
  2. Pengumpul Sampah dan Referensi Siklik
  3. Pembuatan Profil dengan cProfile dan line_profiler
  4. Pembuatan Profil Memori dengan tracemalloc
← Kembali ke Python Academy