Il semble que les gens se soient lassés de la gestion manuelle de la mémoire, alors ils ont inventé la collecte des ordures et la vie était assez bonne. Mais qu'en est-il de tous les autres types de ressources? Des descripteurs de fichiers, des sockets ou même des données créées par l'utilisateur comme les connexions à la base de données?
Cela ressemble à une question naïve mais je ne trouve aucun endroit où quelqu'un l'ait posée. Prenons les descripteurs de fichiers. Supposons qu'un programme sache qu'il ne sera autorisé à disposer de 4000 fds qu'au démarrage. Chaque fois qu'il effectue une opération qui ouvrira un descripteur de fichier, que se passe-t-il s'il
- Vérifiez qu'il n'est pas sur le point de s'épuiser.
- Si c'est le cas, déclenchez le garbage collector, ce qui libérera un tas de mémoire.
- Si une partie de la mémoire libérée contenait des références aux descripteurs de fichiers, fermez-les immédiatement. Il sait que la mémoire appartenait à une ressource car la mémoire liée à cette ressource a été enregistrée dans un «registre de descripteurs de fichiers», faute de meilleur terme, lors de son ouverture.
- Ouvrez un nouveau descripteur de fichier, copiez-le dans une nouvelle mémoire, enregistrez cet emplacement de mémoire dans le «registre des descripteurs de fichier» et renvoyez-le à l'utilisateur.
Ainsi, la ressource ne serait pas libérée rapidement, mais elle le serait chaque fois que le gc s'exécutait, ce qui inclut au moins, juste avant que la ressource ne soit sur le point de s'épuiser, en supposant qu'elle ne soit pas entièrement utilisée.
Et il semble que cela serait suffisant pour de nombreux problèmes de nettoyage des ressources définies par l'utilisateur. J'ai réussi à trouver un seul commentaire ici qui fait référence à un nettoyage similaire à celui-ci en C ++ avec un thread qui contient une référence à une ressource et le nettoie lorsqu'il ne reste qu'une seule référence (à partir du thread de nettoyage), mais je peux ' t trouver aucune preuve qu'il s'agit d'une bibliothèque ou d'une partie d'une langue existante.