Parece que las personas se cansaron del manejo manual de la memoria, por lo que inventaron la recolección de basura y la vida fue razonablemente buena. Pero, ¿qué pasa con todos los otros tipos de recursos? ¿Descriptores de archivo, sockets o incluso datos creados por el usuario como conexiones de bases de datos?
Esto se siente como una pregunta ingenua, pero no puedo encontrar ningún lugar donde alguien lo haya hecho. Consideremos los descriptores de archivo. Digamos que un programa sabe que solo se le permitirá tener 4000 fds disponibles cuando se inicie. Cada vez que realiza una operación que abrirá un descriptor de archivo, ¿qué pasaría si lo hiciera?
- Verifique para asegurarse de que no esté a punto de agotarse.
- Si es así, active el recolector de basura, que liberará un montón de memoria.
- Si parte de la memoria liberada contiene referencias a descriptores de archivos, ciérrelos de inmediato. Sabe que la memoria pertenecía a un recurso porque la memoria vinculada a ese recurso se registró en un "registro de descriptor de archivo", a falta de un término mejor, cuando se abrió por primera vez.
- Abra un nuevo descriptor de archivo, cópielo en una nueva memoria, registre esa ubicación de memoria en el 'registro de descriptor de archivo' y devuélvala al usuario.
Por lo tanto, el recurso no se liberaría de inmediato, pero se liberaría cada vez que se ejecutara el gc, lo que incluye, como mínimo, justo antes de que el recurso estuviera a punto de agotarse, suponiendo que no se esté utilizando por completo.
Y parece que eso sería suficiente para muchos problemas de limpieza de recursos definidos por el usuario. Me las arreglé para encontrar un solo comentario aquí que hace referencias a hacer una limpieza similar a esto en C ++ con un hilo que contiene una referencia a un recurso y lo limpia cuando solo tiene una sola referencia restante (del hilo de limpieza), pero puedo ' No encuentre ninguna evidencia de que esto sea una biblioteca o parte de un idioma existente.