2010-09-02 5 views
5

Tengo una aplicación que, para volver a cargar complementos, los requiere con la opción: volver a cargar cada vez que se vuelvan a cargar. Me he dado cuenta de que esto está acumulando memoria de 2 a 3 megas a la vez cuando lo hago. Tengo curiosidad sobre qué podría causar este tipo de cosas. ¿Los datos de las recargas anteriores se mantienen en la memoria? ¿Hay alguna manera de volver a cargar totalmente un espacio de nombres?¿El uso de require con la opción: recargar tiene una tendencia a acumular memoria en Clojure?

EDITAR: También es relevante mencionar que cada uno de estos complementos que se vuelven a cargar hace nuevas definiciones para un método multimétodo en otro espacio de nombres (que nunca se vuelve a cargar). Tal vez los métodos se mantienen en la memoria cuando se recarga?

+0

La forma en que desarrollo en Clojure es modificar la fuente, luego usar/requerir funciones con la opción: recargar. No he experimentado lo que describes, pero normalmente no uso multimedios y solo algunas funciones se redefinen. –

Respuesta

1

Como resultado, no lo probé lo suficiente. La memoria solo crecerá a un cierto nivel, y luego se detendrá y, finalmente, volverá a bajar un poco.

Niños y niñas: pruebe su código antes de quejarse de errores.

1

Clojure aplaza la administración de memoria a la JVM. Aunque no conozco profundamente la base de código de clojure, probablemente solo reasigne los vars con el código recargado, lo que dejará los objetos antiguos hasta que la JVM ejecute el recolector de elementos no utilizados.

Puede indicarle a la JVM que desea que se ejecute el GC utilizando (System/gc), pero en general no se recomienda su uso.

Como alternativa, si conoce las limitaciones de su sistema, puede modificar las banderas de memoria JVM para alentar al GC a ejecutarse con mayor frecuencia (es decir, use un tamaño de pila inferior).

Pero si tiene un sistema que no es realmente limitado de memoria, guardar unos pocos mbs no importa demasiado.

Cuestiones relacionadas