Klassen aus dem Hauptspeicher löschen

mrno

Erfahrenes Mitglied
Hi,
ich habe mal wieder ein problem.
Ich habe 5 classen die sehr viel speicher brauchen(Es werden sehr viele bilder usw geladen). Wie kann ich jetzt die klassen die ich im moment nicht benötige aus dem speicher löschen?
Mein problem ist es das jede der 5 classen eine methode besitzt die so aussieht:
Code:
public void auswahl(int auswahl){
switch(auswahl){
case 0:{new Class0();};break;
case 1:{new Class1();};break;
case 2:{new Class2();};break;
case 3:{new Class3();};break;
case 4:{new Class4();};break;
};
}
Nachdem eine andere Classe ausgeführt wird kann die alte aus dem hauptspeicher gelöscht werden. Wie mache ich das.
 
Hallo!

Ich denke du verwechselst da etwas... willst du wirklich die entsprechende Klasse entladen oder nur dafür sorgen, dass die Instanz dieser Klasse vom GC aufgesammelt wird? Ich glaube du meinst eher letzteres.

Eine Klasse wird dann entladen (vom GC aufgesammelt) wenn die entsprechende Class Instanz nicht mehr referenziert wird und der dazugehörige ClassLoader gc'ed wurde. Das ist allerdings recht umständlich zu bewerkstelligen und funktioniert nicht immer ganz sauber (da die Klassen innerhalb der JVM nochmal gecached werden).

Eine Instanz wird vom GC aufgesammelt, wenn sie von keinem Thread aus mehr erreichbar ist. D.h. wenn es keine Referenz auf die Instanz gibt, die noch von irgendeinem Thread heraus angesprochen werden kann. Den genauen GC Zeitpunkt festzulegen ist aufgrund des nicht determinstischen Garbage Collectors nicht möglich.

Gruß Tom
 
Mein problem dabei ist jetzt wie setze ich dieses um. Wenn ich die Methode über new Class0(); aufrufe wird es doch wie ein unterprogramm verwendet oder?
 
Hallo mrno,

aus Tom's Post habe ich folgendes verstanden: Der GC kann Objekte, Instanzen dann aufsammeln, aufräumen wenn keine Referenzen mehr zu ihnen bestehen. Habe versucht dies umzusetzen.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.*;

public class Example implements ActionListener {

	public static Class c;

	public Example() {
		c = new Class1();
	}

	public static void main(String[] args) {
		new Example();
	}

	public void actionPerformed(ActionEvent e) {
		int r = (int) (Math.random() * 3);
		switch (r) {
		case 1: {
			c.dispose();
			c = null;
			c = new Class1();
			break;
		}
		case 2: {
			c.dispose();
			c = null;
			c = new Class2();
			break;
		}
		default: {
			c.dispose();
			c = null;
			c = new Class3();
		}
		}
	}

	abstract class Class {
		public abstract void dispose();
	}

	class Class1 extends Class {
		private JWindow w = new JWindow();

		private JLabel l = new JLabel(" ");

		private JButton b = new JButton("Change");

		private Calendar cal = new GregorianCalendar();

		private Image img = Toolkit.getDefaultToolkit().getImage("b1.jpg");

		public Class1() {
			w.setAlwaysOnTop(true);
			w.setLocationByPlatform(true);
			w.add(l, BorderLayout.NORTH);
			w.add(new JLabel(new ImageIcon(img)), BorderLayout.CENTER);
			w.add(b, BorderLayout.SOUTH);

			w.getContentPane().setBackground(Color.BLUE);
			l.setFont(new Font(l.getFont().getFamily(), Font.PLAIN, 20));
			b.addActionListener(Example.this);

			new Thread() {
				public void run() {
					while (true) {
						cal.setTimeInMillis(System.currentTimeMillis());
						l.setText(cal.getTime().toString());
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						w.pack();
					}
				}
			}.start();

			w.setVisible(true);
		}

		public void dispose() {
			w.dispose();
			b.removeActionListener(Example.this);
			img.flush();
			img = null;
		}
	}

	class Class2 extends Class {
		private JWindow w = new JWindow();

		private JLabel l = new JLabel(" ");

		private JButton b = new JButton("Change");

		private Calendar cal = new GregorianCalendar();

		private Image img = Toolkit.getDefaultToolkit().getImage("b2.jpg");

		public Class2() {
			w.setAlwaysOnTop(true);
			w.setLocationByPlatform(true);
			w.add(l, BorderLayout.NORTH);
			w.add(new JLabel(new ImageIcon(img)), BorderLayout.CENTER);
			w.add(b, BorderLayout.SOUTH);

			w.getContentPane().setBackground(Color.RED);
			l.setFont(new Font(l.getFont().getFamily(), Font.PLAIN, 30));
			b.addActionListener(Example.this);

			new Thread() {
				public void run() {
					while (true) {
						cal.setTimeInMillis(System.currentTimeMillis());
						l.setText(cal.getTime().toString());
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						w.pack();
					}
				}
			}.start();

			w.setVisible(true);
		}

		public void dispose() {
			w.dispose();
			b.removeActionListener(Example.this);
			img.flush();
			img = null;
		}
	}

	class Class3 extends Class {
		private JWindow w = new JWindow();

		private JLabel l = new JLabel(" ");

		private JButton b = new JButton("Change");

		private Calendar cal = new GregorianCalendar();

		private Image img = Toolkit.getDefaultToolkit().getImage("b3.jpg");

		public Class3() {
			w.setAlwaysOnTop(true);
			w.setLocationByPlatform(true);
			w.add(l, BorderLayout.NORTH);
			w.add(new JLabel(new ImageIcon(img)), BorderLayout.CENTER);
			w.add(b, BorderLayout.SOUTH);

			w.getContentPane().setBackground(Color.YELLOW);
			l.setFont(new Font(l.getFont().getFamily(), Font.PLAIN, 50));
			b.addActionListener(Example.this);

			new Thread() {
				public void run() {
					while (true) {
						cal.setTimeInMillis(System.currentTimeMillis());
						l.setText(cal.getTime().toString());
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						w.pack();
					}
				}
			}.start();

			w.setVisible(true);
		}

		public void dispose() {
			w.dispose();
			b.removeActionListener(Example.this);
			img.flush();
			img = null;
		}
	}
}


Vg Erdal
 
Hallo!

Beispiel:
Java:
package de.tutorials;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Tom
 *
 */
public class GCExample {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        int i = 0;
        List list = new ArrayList();
        while(true){
            Object o =     new ResourceIntensiveMemoryHog("Hog"+ i++);
            list.add(o); // hiermit halten wir eine Referenz zur Instanz, 
                         // weshalb sie vom GC nicht aufgesammelt werden kann
                         // was dann nach kurzer Zeit zu einem 
                         // Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
                         // führt. Kommentieren wir die list.add(0) Zeile aus, so kann der GC die Instanz wegräumen.
            Thread.sleep(100L);
        }
    }
    
    static class ResourceIntensiveMemoryHog{
        int[] data;
        String id;
        
        public ResourceIntensiveMemoryHog(String id){
            this.id = id;
            this.data = new int[Integer.MAX_VALUE/1024];
        }
        
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println("GC eats: " + this.id);
        }
    }
}

Über das References API erlaubt Java eine gewisse Interaktion mit dem GC:
http://www.tutorials.de/forum/java/...-lang-ref-reference.html?highlight=References

Gruß Tom
 
Zurück