gc_ref_counts.py 1.16 KB
Newer Older
Caleb C. Sander's avatar
Caleb C. Sander committed
1
# -m 10008
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# Simple test: one garbage value refers to non-garbage
non_garbage = 123
garbage = [0, non_garbage]
garbage[0] = garbage
# output 184 bytes in use; 6 refs in use
mem()
del garbage
# output 184 bytes in use; 6 refs in use
mem()
gc()
# output 104 bytes in use; 4 refs in use
mem()
# output 123
print(non_garbage)
del non_garbage
# output 72 bytes in use; 3 refs in use
mem()

# More complex test: multiple garbage values refer to each other and non-garbage
a = {}
b = {"prev": a}
a["next"] = b
c = {"prev": b, "next": a}
b["next"] = c
a["prev"] = c
a["value"] = "aaa"
b["value"] = [a["value"], "bbb"]
c["value"] = b["value"]
values1 = c["value"]
values2 = values1
# output aaa
print(a["value"])
# output ["aaa", "bbb"]
print(b["value"])
# output ["aaa", "bbb"]
print(c["value"])
# output 1224 bytes in use; 25 refs in use
mem()
del a
del b
del c
# output 1224 bytes in use; 25 refs in use
mem()
gc()
# output 216 bytes in use; 7 refs in use
mem()
# output ["aaa", "bbb"] ["aaa", "bbb"]
print(values1, values2)
del values1
# output 216 bytes in use; 7 refs in use
mem()
del values2
# output 72 bytes in use; 3 refs in use
mem()
gc()
# output 72 bytes in use; 3 refs in use
mem()