Hallo,
ich habe anscheinend einen recht großen Memory Leak in meiner Anwendung und verstehe nicht ganz warum bzw. ich finde ihn auch nicht.
Es handelt sich um eine RCP Anwendung, mit der ich übungshalber einen Towerdefense Editor erstelle um mich ein wenig in das Ganze einzuarbeiten. Momentan erstellt es eine Karte mit einem Hintergrundbild und ansonsten eigentlich nicht viel mehr.
Wenn ich nun Karten lade, scheint der Speicherplatz der alten Karte nicht freigegeben zu werden, wenn ich mich mit JConsole verbinde und im Memory TAB nachschaue. Kann mir vielleicht jemand sagen, woran das liegt?
hier die Methode, die bei load aufgerufen wird
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public void load(String mapFilePath)
{
try
{
FileInputStream fin = new FileInputStream(mapFilePath);
ObjectInputStream ois = new ObjectInputStream(fin);
setMap((TDMap) ois.readObject());
ois.close();
fin.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
|
setMap
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
public void setMap(TDMap map)
{
if (this.map != null)
this.dispose();
changeSupport.firePropertyChange("Map", this.map, this.map = map);
initMapCanvas();
}
|
dispose
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
public void dispose()
{
if (imgBackground != null)
imgBackground.dispose();
if (batchImage != null)
batchImage.dispose();
}
|
und initMapCanvas
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
private void initMapCanvas()
{
Bundle bundle = FrameworkUtil.getBundle(this.getClass());
URL url = FileLocator.find(bundle, new Path("icons/" + map.getBackground()), null);
imgBackground = ImageDescriptor.createFromURL(url).createImage();
mapCanvas.getParent().setBounds(0, 0, map.getWidth(), map.getHeight());
mapCanvas.getParent().setBackgroundMode(SWT.INHERIT_DEFAULT);
mapCanvas.setBounds(0, 0, map.getWidth(), map.getHeight());
batchImage = new Image(mapCanvas.getDisplay(), map.getWidth(), map.getHeight());
mapCanvas.redraw();
}
|
Eigentlich sollten die Bilder ja immer disposed werden, bevor eine neue Karte geladen wird, aber laut Memoryübersicht ist dem nicht so. In TDMap ist nichts besonderes drin, außer int/String Werte. Hier noch der restliche Quellcode, falls ihn jemand benötigt.
https://dl.dropbox.com/u/6414966/src.zip
Ich entwickle in Eclipse HELIOS Service Release 2 und dem JDK 1.7.0_05.
Es scheint auch so, als würde der HEAP-Speicher kontinuierlich wachsen, was mich auch etwas wundert. Vielleicht ist das auch alles normal, aber falls sich hier jemand besser damit auskennt, dann möge er mich bitte erleuchten^^
Vielen Dank