Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 21 von 21

Thema: Wann stirbt die Referenzierung oder woher weiss der Garbarge-Collector, dass ...

  1. #16
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Nöö...

    Nöö, warum sollte die Klasse nur ne Art namespace sein?

    Wird die Klasse vom GC entsorgt, sterben auch die Objekte auf die statische Referenzen dieser Klasse verweisen, solange es natürlich keine anderen gibt.

  2. #17
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von RogerJFX
    delete kann nur aufräumen, was mit new erzeugt wurde. Statisches Zeug wird nie mit new instanziert.
    Scherzkeks!
    Seit wann kann man keine statische Pointervariable deklarieren?
    (Bzw Referenz in Java)

    Übrigend war das Problem in diesem Thread die irrtümliche Einstufung verschiedener Factories als Singleton.

    Wie man durch einen einfachen Referenz Vergleich hätte feststellen können, erzeugt zb die Factory Methode Calendar.getInstance immer eine neue Instanz, was ja auch ganz logisch ist, denn eine Calendar Instanz beschreibt einen bestimmten Zeitpunkt und es wäre sonst nicht möglich mit mehr als einem Zeitpunktwert gleichzeitig zu arbeiten
    Sehr unpraktischt

    Das einzige Singleton in Java das mir gerade einfällt hat als Erzeuger Methode den selben Namen wie die Klasse nur eben mit get Prefix (java.awt.Toolkit)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #18
    Registrierter Benutzer
    Registriert seit
    16.06.2002
    Beiträge
    18
    Zitat Zitat von anda_skoa
    Scherzkeks!
    Übrigend war das Problem in diesem Thread die irrtümliche Einstufung verschiedener Factories als Singleton.

    Wie man durch einen einfachen Referenz Vergleich hätte feststellen können, erzeugt zb die Factory Methode Calendar.getInstance immer eine neue Instanz, was ja auch ganz logisch ist, denn eine Calendar Instanz beschreibt einen bestimmten Zeitpunkt und es wäre sonst nicht möglich mit mehr als einem Zeitpunktwert gleichzeitig zu arbeiten
    Sehr unpraktischt
    ja, tschuldigung. war mein Fehler. Für mich war Singleton wirklich neu. Ich habe vorher tatsächlich ein Objekt in der Hauptklasse erzeugt und dieses dann an alle aus der Hauptklasse gestarten Objekte als Parameter übergeben -- weil ich eben nur einen DateFormater und nur ein Ressource haben wollte...

    viele Grüße
    kit

  4. #19
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Java ist ein wenig eigens im Speichermamagement, da geb ich dir recht.
    Du kannst beispielsweise den GC mit System.gc() (glaub ich wars) aufrufen, was dir aber nicht verspricht, dass er gleich ausgefuehrt wird. Es ist nor so was wie eine Empfehlung- "so, nun solltest du wieder was tun".

    Intern hat jede Instanz einer klasse einen counter auf sich selbst, wird eine Referenz angelegt, wird der counter erhoeht, beim entfenrt eben umgekehrt. Das ist aber nicht ganz sicher. Refernzieren sich beispielsweise zwei Objekte selber und alle anderen Refernzen fallen weg ist der counter == 1 und die Instanzen werden nicht geloescht.

    Deshalb baut die VM eine Baumstruktur an. Diesen Geht der GC durch und markiert alle elemente die er erreicht als gueltig, der rest wird geloescht. Da bei dieser Aktion aber groessere Loecher im Speicher auftreten (ineffizient) wird der gesamte Speicherblock dann in einen anderen Speicherblock geschrieben.

    Nun wird der alte wieder freigegeben...

    So in etwa laeuft das ab,

    mfg nul
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  5. #20
    Registrierter Benutzer Avatar von RogerJFX
    Registriert seit
    13.04.2005
    Beiträge
    35
    Zitat Zitat von ceisserer
    Nöö, warum sollte die Klasse nur ne Art namespace sein?

    Wird die Klasse vom GC entsorgt, sterben auch die Objekte auf die statische Referenzen dieser Klasse verweisen, solange es natürlich keine anderen gibt.
    Seit wann wird eine Klasse vom GC entsorgt? Das ist höchstens eine Sache des dynamic ClassLoaders, was aber hat der mit dem GC zu tun, bzw. hat der ClassLoader jemals etwas entsorgt?

    Das ist es doch gerade, was einen Singleton sinnvoll macht. Die statischen Pointer sind von anfang an vorhanden, und zeigen genau dann, wenn es etwas gibt, auf die Instanz, sonst auf null. Schreibe ich nun:

    //...

    static myClass instance; // = null;
    static instance getInstance() {
    if (instance == null) instance = new myClass();
    return instance;
    }

    , bin ich sicher, daß der Konstruktor eben nur beim ersten Mal aufgerufen wird, und daß darüberhinaus nur eine einzige Instanz im Speicher klebt. Holla, das geht dann aber alles zügig.

    Das Problem ist doch letztlich, wie ich diese Instanz (wenn es sie gibt), die schließlich private ist, je wieder loswerde. Manchmal gibt es ja eine Methode dispose() oder clear(), aber manchmal auch nicht.


    Ich entschließe mich, einen Singleton zu schreiben, wenn ich

    A. aus Preformancegründen ansich eine abstract class benötige mit lauter statischen Variablen/Methoden, meistens eine Klasse mit Basisfunktionalität, die immer wieder benötigt wird.

    B. trotzdem eine gewisse Kapselung im Sinne der OOP durch Instanzierung erreichen will.

    C. ich in keinem Falle mehr als eine Instanz der Klasse im Speicher gleichzeitig zulassen möchte (also ähnlich A.).

    D. ich gegebenfalls den Speicher auch wieder freigeben möchte (betrifft logischerweise nur die Instanz-Variablen/Methoden).

    E. ich sichergehen will, daß diese Überlegungen für alle nächsten Arbeitsschritte verbindlich gelten (deswegen letztlich der private-Konstruktor).


    Übrigens ist Calendar nicht notwendigerweise ein Singleton. Der Konstruktor ist protected, nicht private. Es kann mich also niemand davon abhalten, eine Subclass zu schreiben, die ich entsprechend auch wieder loswerden kann.

    Aber wie werde ich jemals das hier los (oder kann ich das nicht etwa schreiben, wo immer ich will?):

    int day = java.util.Calendar.MONDAY;



    Cheers,

    Roger
    if you can't dazzle em with brillance, baffle em with bullshit

  6. #21
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von RogerJFX
    Seit wann wird eine Klasse vom GC entsorgt?
    Ich denke es war jedem klar das ceisserer Instanz gemeint hat.

    Soweit durchblicken wir die Begriffe der OOP Welt schon um zu merken um was es im wesentlichen geht

    Übrigens ist Calendar nicht notwendigerweise ein Singleton.
    Wie schon geklärt ist es auch keines, sondern die Annahme beruhte auf einem Mißverständis, d.h. kit's Annahme getInstance() wäre ein Hinweis auf Singleton, während getInstance bei den erwähnten Java Klassen eine Factory Method ist.

    @kit: ist übrigens durchaus verständlich sowas zu denken, ich hab ja eigentlich auch versucht dich indirekt zur Erkenntnis zu führen, das man mit einem kleinen Test sowas leicht prüfen bzw widerlegen kann

    Aber wie werde ich jemals das hier los (oder kann ich das nicht etwa schreiben, wo immer ich will?):

    int day = java.util.Calendar.MONDAY;
    Der Integer ist am Stack und wird vermutlich am Ende des Blockbereichs wieder freigegeben. Der Stack wird ja weiterbenutzt.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •