Welcome to a tutorial on Garbage Collection in Python.
All available programming languages, make use of garbage, as it is a collection of memory that is not being used by the program or that was used at a given point, but not in use again; because this memory space remains allocated to the program but is not being used by it, thus it is wasted memory that needs to be cleaned.
Now, what is Garbage collection? It is a process of freeing up memory that is no longer in use by a specific program at a given instance of time.
In terms of memory management, this process is helpful and also it helps in minimizing the wastage of memory. Also, the freed memory by garbage collection can be used for storing other important data or variables for the same program or by any other programs.
In Python, Garbage collection works automatically. In a case where no reference is left to a variable/data/value or object, the memory occupied by that object is freed up by the garbage collection mechanism of python. In so doing, good memory management, as well as the prevention of memory wastage, is provided by Python.
Check out the example below.
class SomeObj:
def __init__(self):
print('The object is created.')
def __del__(self):
print('The object is destroyed.')
obj1 = SomeObj()
obj2 = obj1
obj3 = obj1
print("Set obj1 to None...")
obj1 = None
print("Set obj2 to None...")
obj2 = None
print("Set obj3 to None...")
obj3 = None
Output:
The object is created.
Set obj1 to None...
Set obj2 to None...
Set obj3 to None...
The object is destroyed.
From the example above, there is an object of class SomeObj that is created and referenced by obj1. Also, obj2 and obj3 refer to the same memory location as obj1.
Now, when the object has been created the __init__(init) method is called, and when the object is destroyed, due to garbage collection _the the_del__(del) method is called.
In addition, we created an object of SomeObj, first, and passed its reference to obj1, then to obj2 and obj3, which makes the reference count of that object 3. Now, if we assign all these variables to None, then the references from the object are removed.
Finally, when no reference was left to the object, it is automatically destroyed by the Garbage collector of Python, and the _del_() method is executed.
In most instances, a user might be in need to do garbage collection for memory management, to free up some memory space. Thus, explicit garbage collection is allowed in Python and can be performed by using the gc module. Also, garbage collection can be done by force, by making use of the collect() function of the gc module. Check out the example below:
import gc
class SomeObj:
def __del__(self):
print('The object is destroyed.')
obj1 = SomeObj()
obj2 = obj1
obj3 = obj1
obj1 = None
obj2 = None
obj3 = None
for i in range(10):
dic = {}
dic[0] = dic
print('Collecting...')
n = gc.collect()
print('Unreachable objects:', n)
Output:
The object is destroyed.
Collecting...
Unreachable objects: 9
From the above example, our simple object created (i.e. SomeObj class) is destroyed by Python's implicit garbage collector. However, this is not the same as for object dic, which is a dictionary that points itself again and again forming a cycle. More importantly, objects formed in this cycle cannot be destroyed by the python garbage collector implicitly.
Now, to destroy the objects created by the cycle (i.e. run by the for loop), the collect() method of the gc module is used.
This method (i.e the collect() method) runs garbage collection and destroys the unused objects that are the objects with reference count 0. It also returns the number of unreachable objects; unreachable refers to those objects that have a reference count of 0.