2011-01-03 20 views
12

Tengo entendido que el ClassLoader predeterminado utilizado en Java (y por lo tanto, Clojure) se mantiene en los punteros a cualquier clase anónima creada, y por lo tanto, en lambdas y cierres. Estos son nunca basura recolectada, por lo que representan una "pérdida de memoria". Se está realizando una investigación para Java 7 u 8 (https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm) para agregar un ClassLoader anónimo que no conservará referencias a estas funciones. Mientras tanto, ¿cómo las personas que trabajan con aplicaciones de larga duración en lenguajes como Clojure y Scala fomentan el uso de estos constructos?Clojure closures y GC

¿Existe alguna posibilidad de que Clojure pueda proporcionar su propio ClassLoader anónimo, extendiendo el sistema uno, pero sin mantener las clases creadas?

+0

¿Qué te hace pensar que todavía no hace esto? Echa un vistazo a Compiler.java; buscar llamadas a makeClassLoader. – bendin

Respuesta

13

Desde comentario bendin 's más arriba, y la información de La alegría de Clojure, por Michael Fogus y Chris Houser, en la sección 'tiempo de compilación en tiempo de ejecución vs'(Capítulo 7, Sección 7.2) , Fogus y Houser explican que los cierres y las funciones anónimas se compilan en byte-code en tiempo de compilación y cada llamada a la función de orden superior que devuelve el cierre, simplemente devuelve una nueva instancia de la clase de cierre, y no una Nueva clase. Estas instancias serán, por supuesto, basura recolectada. Dado que existe un límite superior obvio, en tiempo de compilación, en el número de funciones y cierres anónimos, la memoria, con poca frecuencia, si es que alguna vez, será un problema.

Mis preocupaciones eran infundadas.

+2

Gracias por hacer esta pregunta. A pesar de que sus preocupaciones eran infundadas, aprendí algo nuevo y útil de sus esfuerzos. –