tipos - cómo destruir un objeto en java?
sintaxis de un objeto en java (6)
Respuesta corta - E
La respuesta es E
dado que el resto es claramente erróneo, pero ...
Larga respuesta: no es tan simple; depende ...
El hecho simple es que el recolector de basura nunca puede decidir recoger basura en cada objeto que sea un candidato viable para la recolección, a menos que la presión de la memoria sea extremadamente alta. Y luego está el hecho de que Java es tan susceptible a fugas de memoria como cualquier otro idioma, son más difíciles de causar y, por lo tanto, ¡más difíciles de encontrar cuando los causa!
El siguiente artículo contiene muchos buenos detalles sobre cómo funciona la administración de memoria y qué no funciona, y qué implica tomar qué. Cómo funcionan los recolectores de basura generacionales y Gracias por la memoria (Comprender cómo la JVM usa memoria nativa en Windows y Linux)
Si lees los enlaces, creo que obtendrás la idea de que la gestión de memoria en Java no es tan simple como una pregunta de opción múltiple.
Encontré esta pregunta en una entrevista con las siguientes opciones:
¿Cómo destruir un objeto en Java?
a. System.gc();
b. Runtime.getRuntime.gc();
c. object.delete();
d. object.finalize();
e. Java performs gc by itself, no need to do it manually.
La respuesta debería ser e?
¿Qué pasa si e no estaba allí? entonces ? claramente c no es la respuesta. ayb harán gc para toda la aplicación (la pregunta requiere un objeto). Creo que es d porque finalize () se llama justo antes de gc (¿pero es necesario que después de finalizar gc se invoque?) ¿O estoy equivocado? e debe estar allí para responder a esta pregunta?
En Java no hay una manera explícita de hacer recolección de basura. La propia JVM ejecuta algunos hilos en el fondo comprobando los objetos que no tienen ninguna referencia, lo que significa que se pierden todas las formas a través de las cuales accedemos al objeto. Por otro lado, un objeto también es elegible para la recolección de basura si se queda sin alcance, es decir, el programa en el que creamos el objeto finaliza o finaliza. Al llegar a su pregunta, el método finalize es el mismo que el destructor en C ++. El método de finalización se llama justo antes del momento de borrar la memoria de objeto por JVM. Depende de usted definir el método de finalización o no en su programa. Sin embargo, si la recolección de elementos no utilizados del objeto se realiza una vez finalizado el programa, la JVM no invocará el método de finalización que definió en su programa. Podrías preguntar ¿cuál es el uso del método de finalización? Por ejemplo, consideremos que ha creado un objeto que requiere alguna secuencia para un archivo externo y definió explícitamente un método de finalización para este objeto que verifica si la ruta se abrió en el archivo o no, y si no cierra la secuencia. Supongamos que, después de escribir varias líneas de código, pierde la referencia al objeto. Entonces es elegible para recolección de basura. Cuando la JVM está a punto de liberar el espacio de su objeto, la JVM simplemente comprueba si ha definido o no el método de finalización e invoca el método, por lo que no hay riesgo de que se abra la transmisión. el método de finalización hace que el programa sea libre de riesgos y más robusto.
Establecer en nulo. Entonces ya no hay referencias y el objeto será elligable para la recolección de basura. GC eliminará automáticamente el objeto del montón.
La respuesta E es la respuesta correcta. Si E no está allí, pronto se quedará sin memoria (o) Sin respuesta correcta.
El objeto debe ser inalcanzable para ser elegible para GC. JVM hará múltiples escaneos y mover objetos de una generación a otra generación para determinar la elegibilidad de GC y liberará la memoria cuando los objetos no sean alcanzables.
Para aclarar por qué las otras respuestas no pueden funcionar:
System.gc()
(junto conRuntime.getRuntime().gc()
, que hace exactamente lo mismo) insinúa que quiere cosas destruidas. Vagamente. La JVM puede ignorar las solicitudes para ejecutar un ciclo de GC, si no lo necesita. Además, a menos que haya anulado todas las referencias accesibles al objeto, GC no lo tocará de todos modos. Entonces, A y B están descalificados.Runtime.getRuntime.gc()
es mala gramática.getRuntime
es una función, no una variable; necesitas paréntesis después para llamarlo. Entonces B está doblemente descalificado.Object
no tiene método dedelete
. Entonces C está descalificado.Si bien
Object
tiene un método definalize
, no destruye nada. Solo el recolector de basura puede eliminar un objeto. (Y en muchos casos, técnicamente ni siquiera se molestan en hacer eso , simplemente no lo copian cuando lo hacen los demás, por lo que se queda atrás). Todas lasfinalize
son dar la oportunidad a un objeto de limpiarse antes la JVM lo descarta. Además, nunca deberías llamar parafinalize
directamente. (Comofinalize
está protegido, la JVM no permitirá que lo invoque sobre un objeto arbitrario de todos modos). Por lo tanto, D queda descalificado.Además de todo eso,
object.doAnythingAtAllEvenCommitSuicide()
requiere que el código en ejecución tenga una referencia alobject
. Eso solo lo hace "vivo" y, por lo tanto, no apto para la recolección de basura. Entonces, C y D tienen doble descalificación.
Aquí está el código:
public static void main(String argso[]) {
int big_array[] = new int[100000];
// Do some computations with big_array and get a result.
int result = compute(big_array);
// We no longer need big_array. It will get garbage collected when there
// are no more references to it. Since big_array is a local variable,
// it refers to the array until this method returns. But this method
// doesn''t return. So we''ve got to explicitly get rid of the reference
// ourselves, so the garbage collector knows it can reclaim the array.
big_array = null;
// Loop forever, handling the user''s input
for(;;) handle_input(result);
}