Ich habe - auf die Grundlagen heruntergebrochen - ein Programm, welches ein Bild anzeigt und bei ich über Datei -> Öffnen ein Bild auswählen und laden kann. Lade ich ein neues, wird das alte einfach ersetzt. Das geschieht per ImageIO:
Nun lade ich ein großes Bild (2000x8000px). Nach dem Laden verbraucht es seine ~70 MB im Speicher - das ist auch okay und vollkommen logisch. Wenn ich nun allerdings das gleiche Bild noch einmal lade, sind es auf einmal ~120 MB. Wenn ich es nochmal lade, sind es ~190 und es schraubt sich immer höher.
Führt einmal Folgendes Snippet aus, am besten mit einem großen Bild, und beobachtet den Speicherverbrauch im Taskmanager. Nach 30 Sek. des Laufens hat sich das Snippet auf ~550MB RAM hochgeschraubt. Dann kommt irgendwann der GC dazu und senkt es um ~80MB, dann steigt es wieder etwas usw.
Resultat:
Wenn ich in meinem Programm ein Bild öffne, etwas später ein anderes, danach wieder ein anderes, allokiert sich schnell mal ein Speicherverbrauch von 400MB. Wie kann ich dem Einhalt gebieten?
Java:
try {
BufferedImage i = ImageIO.read(new File("images/season.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
Nun lade ich ein großes Bild (2000x8000px). Nach dem Laden verbraucht es seine ~70 MB im Speicher - das ist auch okay und vollkommen logisch. Wenn ich nun allerdings das gleiche Bild noch einmal lade, sind es auf einmal ~120 MB. Wenn ich es nochmal lade, sind es ~190 und es schraubt sich immer höher.
Führt einmal Folgendes Snippet aus, am besten mit einem großen Bild, und beobachtet den Speicherverbrauch im Taskmanager. Nach 30 Sek. des Laufens hat sich das Snippet auf ~550MB RAM hochgeschraubt. Dann kommt irgendwann der GC dazu und senkt es um ~80MB, dann steigt es wieder etwas usw.
Java:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test {
public static void main(String[] args) {
while (true)
{
try {
BufferedImage i = ImageIO.read(new File("images/season.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
try { //kleine Erholung
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Wenn ich in meinem Programm ein Bild öffne, etwas später ein anderes, danach wieder ein anderes, allokiert sich schnell mal ein Speicherverbrauch von 400MB. Wie kann ich dem Einhalt gebieten?