Ich hab hier ein kleines Problem das ich nicht nachvollziehen kann, obwohl ich es scheinbar bereits gelöst hab. Trotzdem verstehe ich nicht wieso es auftreten konnte.
Ich hab ein SWT-Programm mit einer loop die dauerhaft updatet und malt, nach nichtmal einer Minute erhalte ich die Meldung Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
mit Verweis auf die Zeile
in dieser Funktion:
Die auskommentierten Zeilen waren die Lösung, so wie es jetzt ist sehe ich im S-Leak tool dass sich da tausende Image Objekte anhäufen. Wieso wird da etwas nicht freigegeben? Bei SWT ist mir klar dass ich die Objekte die Systemressourcen benutzen wieder mit dispose() entfernen muss, das hab ich auch überall getan wo man es tun muss. Aber wieso muss ich hier den beiden arrays erstmal null zuweisen? mit .clone() die arrays dem Konstruktor zu übergeben hatte keinen Unterschied gemacht.
Wo liegt also das Problem?
Ich hab ein SWT-Programm mit einer loop die dauerhaft updatet und malt, nach nichtmal einer Minute erhalte ich die Meldung Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
mit Verweis auf die Zeile
Java:
byte[] newAlphaData = new byte[src.width*src.height];
Java:
public static ImageData getPortion(org.eclipse.swt.graphics.Image img, Rectangle src)
{
ImageData srcData = img.getImageData();
int bytesPerPixel = srcData.bytesPerLine/srcData.width;
int destBytesPerLine = src.width*bytesPerPixel;
byte[] newData = new byte[src.width*src.height*bytesPerPixel];
byte[] newAlphaData = new byte[src.width*src.height];
for(int srcY = src.y, destY=0;srcY<src.y+src.height ;srcY++, destY++)
{
for(int srcX = src.x, destX= 0; srcX<src.x+src.width ;srcX++,destX++)
{
System.arraycopy(srcData.data, (srcY*srcData.width+srcX)*bytesPerPixel, newData, destY*destBytesPerLine+destX*bytesPerPixel, bytesPerPixel);
System.arraycopy(srcData.alphaData, srcY*srcData.width+srcX, newAlphaData, destY*src.width+destX, 1);
}
}
ImageData newImageData = new ImageData(src.width, src.height, srcData.depth, srcData.palette, destBytesPerLine, newData);
newImageData.alphaData = newAlphaData;
// newData=null;
// newAlphaData=null;
return newImageData;
}
Die auskommentierten Zeilen waren die Lösung, so wie es jetzt ist sehe ich im S-Leak tool dass sich da tausende Image Objekte anhäufen. Wieso wird da etwas nicht freigegeben? Bei SWT ist mir klar dass ich die Objekte die Systemressourcen benutzen wieder mit dispose() entfernen muss, das hab ich auch überall getan wo man es tun muss. Aber wieso muss ich hier den beiden arrays erstmal null zuweisen? mit .clone() die arrays dem Konstruktor zu übergeben hatte keinen Unterschied gemacht.
Wo liegt also das Problem?