Darren Thomas donne une bonne réponse. Cependant, une grande différence entre les approches Java et Python est qu'avec le comptage des références dans le cas commun (pas de références circulaires) les objets sont nettoyés immédiatement plutôt qu'à une date ultérieure indéterminée.
Par exemple, je peux écrire bâclée, code non portable dans CPython tels que
def parse_some_attrs(fname):
return open(fname).read().split("~~~")[2:4]
et le descripteur de fichier pour ce fichier j'ai ouvert sera nettoyé immédiatement parce que dès que la référence à l'ouverture le fichier disparaît, le fichier est récupéré et le descripteur de fichier est libéré. Bien sûr, si j'exécute Jython ou IronPython ou peut-être PyPy, alors le garbage collector ne fonctionnera pas forcément beaucoup plus tard; peut-être que je vais d'abord manquer de descripteurs de fichiers et mon programme va planter.
Donc, vous devriez être en train d'écrire un code qui ressemble à
def parse_some_attrs(fname):
with open(fname) as f:
return f.read().split("~~~")[2:4]
mais parfois les gens aiment compter sur le comptage de référence pour toujours libérer leurs ressources, car il peut parfois rendre votre code un peu plus court. Je dirais que le meilleur garbage collector est celui avec les meilleures performances, qui semblent actuellement être les garbage collecteurs générationnels Java qui peuvent fonctionner dans un thread séparé et a toutes ces optimisations folles, etc. les différences dans la façon dont vous écrivez votre code devraient être négligeables et idéalement inexistantes.
Une autre différence à noter est que GC désireux par comptage de références utilise toujours la mémoire « minimale » (sauf dans le cas circulaire de dépendance), alors que l'approche paresseuse de Java peut entraîner la machine virtuelle Java d'utiliser temporairement beaucoup plus de mémoire que réellement nécessaire, jusqu'à ce qu'un La course GC le remet en ligne. L'approche de Java donne la vitesse au détriment de la mémoire, et a l'avantage quand la mémoire est abondante. Quand c'est rare, l'approche de Python fonctionnera mieux. –
Le comptage de référence est plus lent que le marquage/balayage GC pour plusieurs autres raisons: 1. les écritures de mémoire pour mettre à jour les comptes de référence sont coûteuses et entraînent des problèmes de simultanéité puisqu'elles nécessitent une synchronisation. 2. Les compteurs de référence eux-mêmes utilisent de la mémoire supplémentaire, ce qui augmente la taille de l'objet et, par conséquent, augmente la pression du cache. – mikera