Page 1 of 1

Was genau ist für Objekte ohne Referenzen passiert?

Posted: 04 Feb 2025, 14:51
by Guest
Ich habe ein Testskript mit abendlicher Schleife erstellt Python -Objekte. Zunächst versuchte ich zu verstehen, was mit a () Objekten passiert ist, die keine Referenzen hatten (in Bezug auf die Speicherzuweisung) - aber jetzt ist klar, dass Python es als Referenzzählung ignoriert. Aber wie geht das System damit um?

Code: Select all

from itertools import count
import gc

class A:
def __init__(self):
self.name = "a"

print("Initial GC count:", gc.get_count())
gc_objects_init = [id(obj) for obj in gc.get_objects()]

for number in count():

A() # - Python ignores it. Reference counting is used here. It is clear from Python point of view. But how does the system deal with it?

if number % 5000000 == 0:
gc_objects = gc.get_objects() # it increases (+1) number of Garbage Collector tracked objects - causing a Memory Leak
print(len(gc_objects))
# print(len(gc.get_objects()))

print([id(obj) for obj in gc.get_objects() if id(obj) not in gc_objects_init]) # new objects
print("GC counter:", gc.get_count())
# del gc_objects # it solves the issue
< /code>
Ausgabe: < /p>
Initial GC count: (172, 10, 0)

4965
[124362267579712, 124362267585728, 124362267337664]
GC counter: (173, 10, 0)
4966
[124362267579712, 124362267585728, 124362267337664, 124362267579520]
GC counter: (173, 10, 0)
4967
[124362267579712, 124362267585728, 124362267337664, 124362267579520, 124362267579456

...

4977
[128496873002624, 128496873008576, 128496872760192, 128496873002432, 128496873002368, 128496872759872, 128496873000448, 128496873000192, 128496873000256, 128496872999936, 128496873000000, 128496873002752, 128496873008640, 128496873008768, 128496873008704]
GC counter: (177, 10, 0)
4978
[128496873002624, 128496873008576, 128496872760192, 128496873002432, 128496873002368, 128496872759872, 128496873000448, 128496873000192, 128496873000256, 128496872999936, 128496873000000, 128496873002752, 128496873008640, 128496873008768, 128496873008704, 128496873008832]
GC counter: (178, 10, 0)
4979
< /code>
Wenn ich dieses Skript ausführe und nach Prozessspeicherverbrauch und Müllkollektor verfolgte Objekte: < /p>

[*] Virtueller Speicher verwendet Durch den Prozess erhöht sich -> Speicherleck
[*] Der Garbage Collector verfolgt das Objekt, aber Objekte wurden nicht sofort zu Gen0 hinzugefügt (es kommt später vor)

Das Speicherleck wird durch gc_objects = gc.get_objects () 
verursacht, da ich del gc_objects das Problem verschwindet. Wenn wir uns das neu verfolgte GC -Objekt ansehen, handelt es sich um eine riesige Liste, die das GC -Objekt darstellt (aus der aufrufenden Zeile: gc_objects = gc.get_objects () ). Aber GC oder ein anderer Mechanismus löscht dies nicht in jeder Iteration. Ich bin einfach neugierig, warum GC dies nicht richtig behandelt. Weiß jemand?