¿Una variable de función siempre se elimina de la memoria cuando la función existente está en Java?

Sí, pero si esa variable es una referencia a la memoria asignada en el montón, solo se elimina la referencia, no los datos reales en el montón.

Es decir, por ejemplo, si la variable era un objeto (y no un tipo primitivo como un int), el objeto seguirá existiendo en la memoria, hasta que el recolector de basura finalmente decida ejecutarse y vea que no hay referencias pendientes a ese objeto, y reclama la memoria

Si eso no es lo que quieres, tienes un par de opciones:

  • Invoque el GC manualmente. Eso es generalmente una mala idea; el GC normalmente sabe mejor cuándo ejecutar que usted, lo más probable es que solo empeore su aplicación.
  • Use un grupo de objetos: un par de objetos ya inicializados que borra y reutiliza muchas veces, en lugar de asignar y dejar que el GC se encargue de las asignaciones de negocios. Esto puede conducir a errores muy feos cuando no se implementa correctamente (cuando no se tiene en cuenta la forma en que se usarán y reutilizarán los objetos).

En ambos casos, debe tener pruebas en forma de informes de perfil de rendimiento antes / después que muestren claramente que lo que hizo fue una mejora. Es muy probable que solo empeore las cosas usando tales trucos: la JVM está optimizada para ejecutar código idiomático (estándar, normal), y ninguno de los anteriores es idiomático.

Mi preocupación es el espacio de memoria, quiero usar esto para ahorrar memoria.

Java? Guardar memoria? Es extraño ver aparecer estos dos términos en la misma oración. No tengo idea de cómo “guardar memoria” tiene algo que ver con su pregunta, pero para su preocupación solo tengo una palabra: NO .

Todos los sistemas operativos modernos tienen un mecanismo de memoria virtual. Su computadora ajustará dinámicamente el uso de la memoria para que todo funcione sin problemas. Aquí estamos hablando del uso de memoria en la unidad de Gigabytes. Ahorrar unos kilobytes dentro de su función local no es realmente algo que deba preocupar.

Si sufre una caída en el rendimiento debido a la memoria insuficiente, lo primero que debe hacer es agregar más RAM . Es así de simple. De lo contrario, debe ajustar el uso de la memoria del entorno de tiempo de ejecución general de su computadora, cerrando servicios en segundo plano innecesarios. Si está codificando una plataforma incrustada no Android extremadamente restringida que solo tiene unos pocos megabytes de RAM, no debe elegir Java en absoluto.

Cualquiera sea la ruta que elija, lo menos que debe hacer es micro-optimizar su código. No tiene sentido.

¿Una variable de función siempre se elimina de la memoria cuando la función existente está en Java?

Ahora volvamos a tu pregunta. La respuesta es: dependiendo de su JVM .

Básicamente, las variables locales primitivas se almacenan en la pila, las instancias no primitivas (es decir, objetos definidos por el usuario) se almacenan en el montón, y la referencia a esa instancia de objeto se almacena en la pila. Sin embargo, algunas JVM están optimizadas para usar la pila de objetos. Esto reduce el esfuerzo de recolección de basura.

Depende. Si devuelve la variable de la función y esa variable no es un tipo primitivo, es decir, es una clase o matriz, entonces, dado que Java es un lenguaje recolectado, no se limpiará hasta que no haya más referencias a la variable devuelta . Contraste con C puro donde sin GC, la variable devuelta está mal definida.

Una vez que la función haya terminado de ejecutar, cualquier variable que se haya declarado dentro de la función permanecerá en la memoria hasta que llegue el recolector de basura de Java y libere esa memoria.