Tengo un código que carga una imagen muy grande en la memoria. Por lo tanto, parecía razonable llamar aCuándo recoger basura
System.gc();
antes de cargar la imagen. Por lo que puedo decir, funciona sin problemas.
Ayer decidí utilizar una pieza bastante útil de software llamada FindBugs que escanea su código e informa sobre problemas que pueden causar errores o estrategias generalmente no recomendadas. El problema es que este pedazo de código que mencioné se informa. La descripción es la siguiente:
... fuerzas de recolección de basura; extremadamente dudosa excepto en código evaluación comparativa
Y sigue para elaborar:
Código invoca explícitamente la basura colección. Excepto para uso específico en el análisis comparativo , esto es muy dudoso.
En el pasado, las situaciones donde la gente han invocado explícitamente el recolector de basura en las rutinas tales como los métodos de finalización y cierre o ha dado lugar a enormes agujeros negros rendimiento. La recolección de basura puede ser costosa. Cualquier situación de que fuerce cientos o miles de recolecciones de basura será llevar la máquina a un rastreo.
Así que mi pregunta es: ¿NO ES ACEPTABLE llamar programáticamente al recolector de basura en ese caso? Mi código solo lo llama una vez y el método en el que se usa rara vez se usa. Y si no está bien llamarlo, ¿qué debe hacer en caso de que necesite tanta memoria como sea posible antes de realizar una operación que requiere mucha memoria y necesita liberar la mayor cantidad de memoria posible antes de hacerlo?
En este caso, probablemente esté serializando el rendimiento. Si deja que el GC decida cuándo ejecutar, puede que se ejecute cuando la aplicación está bloqueando en E/S. –
P: Cuándo llamar a System.gc(). A: nunca – KitsuneYMG
wow que fue idea completa. Entiendo totalmente por qué nunca debería llamar a gc por tu respuesta. Muchas gracias. –