F: Wie kann es in Java zu einem Speicherverlust kommen?
A: In Java gibt es viele Gründe für Speicherverluste. Ein typisches Beispiel ist ein Code, der hasCode und nicht implementiert
Die Schlüsselklasse der Methode equal wird in HashMap gespeichert. Am Ende werden viele doppelte Objekte generiert. Alle Speicherlecks
Am Ende wird eine OutOfMemoryError-Ausnahme ausgelöst. Hier ist eine kurze Simulation eines Speicherverlusts durch eine Endlosschleife.
Erklären Sie es anhand eines Beispiels.
Kopieren Sie den Codecode wie folgt:
import java.util.HashMap;
java.util.Map importieren;
öffentliche Klasse MemoryLeak {
public static void main(String[] args) {
Map<Key, String> map = new HashMap<Key, String>(1000);
int counter = 0;
while (wahr) {
// Erstellt aufgrund einer fehlerhaften Schlüsselklasse doppelte Objekte
map.put(new Key("dummyKey"), "value");
counter++;
if (Zähler % 1000 == 0) {
System.out.println("map size: " + map.size());
System.out.println("Freier Speicher nach Zählung " + Zähler
+ " ist " + getFreeMemory() + "MB");
Schlaf (1000);
}
}
}
// innerer Klassenschlüssel ohne hashcode() oder equal() – schlechte Implementierung
statischer Klassenschlüssel {
privater String-Schlüssel;
öffentlicher Schlüssel (String-Schlüssel) {
this.key = Schlüssel;
}
}
//Verzögerung für einen bestimmten Zeitraum in Millisekunden
öffentlicher statischer leerer Schlaf (langer Schlaf für) {
versuchen {
Thread.sleep(sleepFor);
} Catch (InterruptedException e) {
e.printStackTrace();
}
}
// Verfügbaren Speicher in MB abrufen
public static long getFreeMemory() {
return Runtime.getRuntime().freeMemory() / (1024 * 1024);
}
}
Das Ergebnis ist wie folgt:
Kopieren Sie den Codecode wie folgt:
Kartengröße: 1000
Der freie Speicher nach Zählung 1000 beträgt 4 MB
Kartengröße: 2000
Der freie Speicher nach Zählung 2000 beträgt 4 MB
Kartengröße: 1396000
Der freie Speicher nach Zählung 1396000 beträgt 2 MB
Kartengröße: 1397000
Der freie Speicher nach Zählung 1397000 beträgt 2 MB
Kartengröße: 1398000
Der freie Speicher nach Zählung 1398000 beträgt 2 MB
Kartengröße: 1399000
Der freie Speicher nach Zählung 1399000 beträgt 1 MB
Kartengröße: 1400000
Der freie Speicher nach Zählung 1400000 beträgt 1 MB
Kartengröße: 1401000
Der freie Speicher nach Zählung 1401000 beträgt 1 MB
.....
.....
Kartengröße: 1452000
Der freie Speicher nach Zählung 1452000 beträgt 0 MB
Kartengröße: 1453000
Der freie Speicher nach Zählung 1453000 beträgt 0 MB
Ausnahme im Thread „main“ java.lang.OutOfMemoryError: Java-Heap-Speicherplatz
bei java.util.HashMap.addEntry(HashMap.java:753)
bei java.util.HashMap.put(HashMap.java:385)
bei MemoryLeak.main(MemoryLeak.java:10)
F: Wie kann der oben genannte Speicherverlust behoben werden?
A: Implementieren Sie die Methoden equal und hasCode der Key-Klasse.
Kopieren Sie den Codecode wie folgt:
.....
statischer Klassenschlüssel {
privater String-Schlüssel;
öffentlicher Schlüssel (String-Schlüssel) {
this.key = Schlüssel;
}
@Override
öffentlicher boolescher Wert gleich(Objekt obj) {
if (obj-Instanz des Schlüssels)
return key.equals(((Key) obj).key);
anders
return false;
}
@Override
public int hashCode() {
return key.hashCode();
}
}
.....
Eine erneute Ausführung des Programms führt zu folgenden Ergebnissen:
Kopieren Sie den Codecode wie folgt:
Kartengröße: 1
Der freie Speicher nach Zählung 1000 beträgt 4 MB
Kartengröße: 1
Der freie Speicher nach Zählung 2000 beträgt 4 MB
Kartengröße: 1
Der freie Speicher nach Zählung 3000 beträgt 4 MB
Kartengröße: 1
Der freie Speicher nach Zählung 4000 beträgt 4 MB
...
Der freie Speicher nach Zählung 73000 beträgt 4 MB
Kartengröße: 1
Der freie Speicher nach Zählung 74000 beträgt 4 MB
Kartengröße: 1
Der freie Speicher nach Zählung 75000 beträgt 4 MB
F: Wie finden Sie in tatsächlichen Szenarien Speicherlecks?
A: Rufen Sie die Thread-ID mit dem folgenden Code ab
Kopieren Sie den Codecode wie folgt:
C:/>jps
5808Jps
4568 Speicherleck
3860 Haupt
Öffnen Sie jconsole über die Befehlszeile
Kopieren Sie den Codecode wie folgt:
C:/>jconsole 4568
Die Schlüsselklasse, die hasCode und equal implementiert, und das Diagramm, das sie nicht implementiert, lauten wie folgt:
Kein Speicherverlust:
Speicherverlust verursachen: