Was genau ist für Objekte ohne Referenzen passiert?Python

Python-Programme
Guest
 Was genau ist für Objekte ohne Referenzen passiert?

Post 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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post