P: ¿Cómo puede ocurrir una pérdida de memoria en Java?
R: En Java, existen muchas razones para las pérdidas de memoria. Un ejemplo típico es un código que no implementa hasCode y
La clase clave del método igual se guarda en HashMap. Al final, se generarán muchos objetos duplicados. Todas las pérdidas de memoria
Al final, se generará una excepción OutOfMemoryError. Aquí hay una breve simulación de una pérdida de memoria a través de un bucle infinito.
Explíquelo con un ejemplo.
Copie el código de código de la siguiente manera:
importar java.util.HashMap;
importar java.util.Map;
pérdida de memoria de clase pública {
público estático vacío principal (String [] argumentos) {
Mapa<Clave, Cadena> mapa = nuevo HashMap<Clave, Cadena>(1000);
contador int = 0;
mientras (verdadero) {
// crea objetos duplicados debido a una clase de clave incorrecta
map.put(nueva clave("dummyKey"), "valor");
contador++;
si (contador % 1000 == 0) {
System.out.println("tamaño del mapa: " + map.size());
System.out.println("Memoria libre después del conteo" + contador
+ " es " + getFreeMemory() + "MB");
dormir(1000);
}
}
}
// clave de clase interna sin código hash() o igual() - mala implementación
Clave de clase estática {
clave de cadena privada;
Clave pública (clave de cadena) {
esta.clave = clave;
}
}
//retraso durante un período determinado en milisegundos
sueño vacío estático público (dormir largo para) {
intentar {
Thread.sleep(dormirPara);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
//obtener memoria disponible en MB
público estático largo getFreeMemory() {
return Runtime.getRuntime().freeMemory() / (1024 * 1024);
}
}
El resultado es el siguiente:
Copie el código de código de la siguiente manera:
tamaño del mapa: 1000
La memoria libre después de contar 1000 es 4 MB
tamaño del mapa: 2000
La memoria libre después del conteo 2000 es de 4 MB
tamaño del mapa: 1396000
La memoria libre después del recuento 1396000 es de 2 MB
tamaño del mapa: 1397000
La memoria libre después del recuento 1397000 es de 2 MB
tamaño del mapa: 1398000
La memoria libre después del recuento 1398000 es de 2 MB
tamaño del mapa: 1399000
La memoria libre después del recuento 1399000 es 1 MB
tamaño del mapa: 1400000
La memoria libre después del conteo 1400000 es 1 MB
tamaño del mapa: 1401000
La memoria libre después del recuento 1401000 es 1 MB
.....
.....
tamaño del mapa: 1452000
La memoria libre después del recuento 1452000 es 0 MB
tamaño del mapa: 1453000
La memoria libre después del recuento 1453000 es 0 MB
Excepción en el hilo "principal" java.lang.OutOfMemoryError: espacio del montón de Java
en java.util.HashMap.addEntry(HashMap.java:753)
en java.util.HashMap.put(HashMap.java:385)
en MemoryLeak.main (MemoryLeak.java:10)
P: ¿Cómo solucionar la pérdida de memoria anterior?
R: Implemente los métodos equals y hasCode de la clase Key.
Copie el código de código de la siguiente manera:
.....
Clave de clase estática {
clave de cadena privada;
Clave pública (clave de cadena) {
esta.clave = clave;
}
@Anular
público booleano es igual (Objeto obj) {
si (obj instancia de clave)
return key.equals(((Clave) obj).key);
demás
devolver falso;
}
@Anular
público int código hash() {
devolver clave.hashCode();
}
}
.....
Volver a ejecutar el programa producirá los siguientes resultados:
Copie el código de código de la siguiente manera:
tamaño del mapa: 1
La memoria libre después de contar 1000 es 4 MB
tamaño del mapa: 1
La memoria libre después del conteo 2000 es de 4 MB
tamaño del mapa: 1
La memoria libre después de contar 3000 es 4 MB
tamaño del mapa: 1
La memoria libre después del conteo 4000 es de 4 MB
...
La memoria libre después del conteo 73000 es de 4 MB
tamaño del mapa: 1
La memoria libre después del conteo 74000 es de 4 MB
tamaño del mapa: 1
La memoria libre después del conteo 75000 es de 4 MB
P: En escenarios reales, ¿cómo se encuentran las pérdidas de memoria?
R: Obtenga el ID del hilo a través del siguiente código
Copie el código de código de la siguiente manera:
C:/>jpg
5808Jps
4568 pérdida de memoria
3860 principal
Abra jconsole a través de la línea de comando
Copie el código de código de la siguiente manera:
C:/>jconsola 4568
La clase Key que implementa hasCode y equals y el gráfico que no lo implementa son los siguientes:
Sin pérdida de memoria:
Causa pérdida de memoria: