JAVA AUFGABEN UND LINKS

Dieser Artikel beschreibt , wie die Klassen aus dem Standardpaket verwenden 
java.lang.ref
, wie 
Softreference
die WeakReference
PhantomReference
.

Betrachten wir ein Beispiel, wo diese Klassen benötigt werden. 

Es gibt eine solche Aufgabe: Es ist notwendig , den Download von der Server - Seite auf der Client - Seite einer Client - Anforderung zu realisieren.
Um dies zu tun, können Sie eine Sammlung von Objekten auf dem Client implementieren, die bereits geladenen Objekte gespeichert werden, so dass , wenn
die zweite Anforderung für das gleiche Objekt nicht laden Sie es wieder haben, und geben sie in dieser Sammlung, dh Implementierung des Cache auf dem Client.
Im Laufe der Zeit wird der Kunde eine Menge neuer Objekte herunterladen, um sie zu Ihrer Sammlung speichern und vorher Artikel bereits sind heruntergeladen
nicht mehr relevant, und nimmt nur Platz im Speicher. Insgesamt - ein Mechanismus Cache-Busting.

Hier können Sie verschiedene Wege gehen, schauen Sie sich einige:

1. Sie können verfolgen , wenn das Objekt nicht mehr auf dem Client verwendet, und entfernen Sie sie dann aus der Sammlung.
Diese Lösung erfordert jedoch transparent viele Änderungen in der Logik des Client-Betrieb, und ist ein idealer zu anderen Klassen mit diesen Objekten arbeiten. 

2. Um den Mechanismus der „schwachen Glieder“ in Java zu verwenden.

Was sind diese „schwachen Glieder“?

In Java können Referenzen durch geteilt werden „Kraft“ .
Die folgenden sind alle vier Arten von Verbindungen sortiert nach „force“ (absteigend):

1.  starke Verbindungen (starke Referenz) . Dies sind normale Links , die wir verwenden immer. Wenn wir Rectangle rect = new Rectangle () deklarieren, das Objekt
kann durch das referenzierte rect nicht so lange aus dem Speicher durch die Speicherbereinigungseinrichtung entfernt werden , da das Objekt zumindest eine starke Verbindung hat;

2.  Softlinks (Softreference) . Anzeigen Softlinks sind wie folgt:

Softreference rect = new Softreference (new Rectangle ());

Sie können rect.get () -Methode zu erhalten ein Rectangle - Objekt selbst nutzen. Get () Methode in der Klasse Referenz erklärt, die von vererbt werden
Softreference, WeakReference, PhantomReference. Es ist wichtig zu verstehen , dass die Methode get () null zurückkehren kann. Dies geschieht , wenn
Ihr Programmspeicher voll ist , und es besteht die Gefahr eines OutOfMemoryError, dann wird der Garbage Collector entfernt Objekte , die von referenziert werden
die Soft - Link. Es ist diese Art von Links für Objekt - Caching nützlich ist.

3. Die  schwachen Verbindungen (WeakReference) .
Die Verwendung von schwachen Verbindungen ist ähnlich wie mit Softlinks, Anzeige:

WeakReference rect = new WeakReference (new Rectangle ());

Der Unterschied besteht darin , dass das Objekt , das durch ein schwaches Glied verwiesen wird , kann durch den Aufruf cborschika Trümmer jederzeit entfernt werden, dh
Dies bedeutet nicht unbedingt niedrigen Speicherbedingungen.

4.  Phantomgliedern (PhantomReference) .
ein Phantom Referenz zu schaffen , ist ähnlich wie die anderen:

PhantomReference rect = 

neue PhantomReference (new Rectangle (), Warteschlange);

Der Unterschied besteht darin , dass es notwendigerweise das Objekt klassifiziert
Warteschlange Warteschlange - ist repräsentativ Reference Klasse. Warteschlangen werden auch Softreference und WeakReference verwendet. Ihre Funktion besteht darin ,
dass , wenn ein Objekt zugänglich ist , durch eine Verbindung gelöscht wird, die Objektreferenz in Reference Warteschlange verfügbar ist. Dieser
Mechanismus ermöglicht es Ihnen , leer Referenzen zu entfernen.

Get () -Methode in einem Phantom Referenz genannt immer null zurück. Dies ist
auf die Tatsache zurückzuführen, was sie verwendet werden.

Lesen Sie mehr:   Ausrichtung in einer Tabellenzelle HTML CENTER

Die Tatsache , dass das schwache Glied in Position vor dem Objekt gebracht wird , auf die sie verweist wird
abgeschlossen (finalisieren ()) und durch die Speicherbereinigungseinrichtung gelöscht. Ie Verfahren Finalisierung (Objekt) gelöscht werden , um einen strengen haben kann
, wird auf das gelöschte Objekt und somit zu „retten“ , es von dem Garbage - Collector. Aber das schwache Glied wird bereits in der Warteschlange und werden vernichtet.

Anders als Phantomreferenz dass sie in die Warteschlange gestellt wird, nur „in die“ Entfernung des Objekts, auf das er zeigt - das ist seine Hauptfunktion.

Betrachten Sie die Schwachstellen in einem praktischen Beispiel.

Objekte in diesem Punkt unsere Links sind Klasse BigObject.

class BigObject {
  private int value;
  public BigObject(Integer pValue) {
    value = pValue;
  }
  @Override
  protected void finalize() throws Throwable {
    System.out.println("BigObject ("+value+") finalize()");
  }
  @Override
  public String toString() { return value+"";  }
}

Folgende Objekte werden zum Testen verwendet:

  List strongList; // сильные ссылки
        List> softList; // мягкие ссылки
        List> weakList; // слабые ссылки
        List> phantomList; // фантомные ссылки
        ReferenceQueue queue; // очередь
        List loadMemoryList; // здесь будут храниться ссылки на строки, которые
        // используются для загрузки памяти

Um die Testergebnisse anzuzeigen, verwenden wir die folgenden Methoden:

private void printLists(){
  System.out.println("Strong references: ");
  for (BigObject bo : strongList) System.out.print(bo+" ");
  System.out.println();
  System.out.println("SoftReferences: ");
  printList(softList);
  System.out.println("WeakReferences: ");
  printList(weakList);    
  System.out.println("PhantomReferences: ");
  printList(phantomList);
}

private void printList(List> pList){
  for (Reference ref : pList)
    System.out.print(ref.get()+" ");

          System.out.println();
}

Verfahren zur Initialisierung und Speichernutzung sind wie folgt:

private void init(){
  strongList = new ArrayList();
  softList = new ArrayList>();
  weakList = new ArrayList>();
  phantomList = new ArrayList>();
  loadMemoryList = new ArrayList();
  queue = new ReferenceQueue();
  for (int i=0; i<3; i++){
    strongList.add(new BigObject(i));
    softList.add(new SoftReference(new BigObject(i)));

            weakList.add(new WeakReference(new BigObject(i)));
    phantomList.add(new PhantomReference(new BigObject(i), queue));
  }    
  printLists();
}

private void loadMemory(){
  for (int i=0; i<1200000; i++){
    loadMemoryList.add(i+"");
  }
}

Jetzt machen wir die Tests. Für den ersten Test verwenden wir den folgenden Code:

public void testPhantomReferences(){
  init(); // инициализация
  System.gc(); // вызов сборщика мусора
  System.out.println("garbage collector invoked");
  printLists(); // вывод
}

Das Ergebnis ist:


        Strong references:
        0 1 2
        SoftReferences:
        0 1 2
        WeakReferences:
        0 1 2
        PhantomReferences:
        null null null
        garbage collector invoked
        Strong references:
        0 BigObject (2) finalize()
        BigObject (2) finalize()
        BigObject (1) finalize()
        BigObject (1) finalize()
        BigObject (0) finalize()
        BigObject (0) finalize()
        1 2
        SoftReferences:
        0 1 2
        WeakReferences:
        null null null
        PhantomReferences:
        null null null
    

Erläuterung: Wie bereits erwähnt, ist die Phantomreferenz immer null zurück.
Nach der Garbage Collector Aufruf wurden Objekte bezeichnet mit dem Bezug Phantom (PhantomReference) und Schwachstellen (WeakReference) gelöscht.
Im zweiten Test, sollten Sie die Zeit Objekte zu entfernen , die von Softlinks (Softreference) referenziert werden. Testcode dargestellt:


public void testSoftRefences(){
  init();
  System.gc();
  System.out.println("garbage collector invoked");
  printLists();
  System.out.println("memory usage increased");
  loadMemory(); // загрузка памяти
  System.out.println("loadMemoryList.size() = "+loadMemoryList.size());
  System.gc();
  System.out.println("garbage collector invoked");
  printLists();    
}

Das Ergebnis ist:


        Strong references:
        0 1 2
        SoftReferences:
        0 1 2
        WeakReferences:
        0 1 2
        garbage collector invoked
        Strong references:
        BigObject (2) finalize()
        BigObject (1) finalize()
        BigObject (0) finalize()
        0 1 2
        SoftReferences:
        0 1 2
        WeakReferences:
        null null null
        memory usage increased
        loadMemoryList.size() = 1200000
        garbage collector invoked
        BigObject (2) finalize()
        BigObject (1) finalize()
        BigObject (0) finalize()
        Strong references:
        0 1 2
        SoftReferences:
        null null null
        WeakReferences:
        null null null
    

Erläuterung: Im ersten Schritt werden die Objekte darauf schwache Verbindungen durch (WeakReference) wurden nach dem Aufruf der Garbage Collector entfernt.
Als nächstes gibt es einen Ladespeicher und die Speicherbereinigungseinrichtung wieder zu verwenden . Danach werden gelöschte Objekte , die
Softlinks (Softreference) hingewiesen. Als Ergebnis , nachdem diese Aktionen Objekte waren nur mit geraden (stark) Links zu ihnen.

Lesen Sie mehr:   CREATE eine neue Website für TIMEWEB

Befund

Die Verwendung unterschiedlicher Arten von Links in Java ermöglicht es Ihnen , das Risiko von Speicherlecks (Speicherlecks), zu reduzieren , zu
erhöhen sowie die Effizienz der Speichernutzung. Zur Implementierung kann die Cache WeakHashMap Klasse verwendet werden.

Cherish die Erinnerung!

Ivan Kaplin, im Februar 2010.

Weitere Informationen

Anstecken Speicherlecks mit schwachen Referenzen:

http://www.ibm.com/developerworks/ru/library/j-jtp11225/index.html

Das Verständnis Schwache Referenzen:

http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html

Ссылки на api используемых классов:

http://java.sun.com/javase/6/docs/api/java/util/WeakHashMap.html

http://java.sun.com/javase/6/docs/api/java /lang/ref/Reference.html

http://java.sun.com/javase/6/docs/api/java/lang/ref/ReferenceQueue.html

http://java.sun.com/javase/6/docs /api/java/lang/ref/PhantomReference.html

http://java.sun.com/javase/6/docs/api/java/lang/ref/WeakReference.html Seite

http://java.sun.com/javase /6/docs/api/java/lang/ref/SoftReference.html

Parameter an Java. - JAVARUSH

Variable in Java - ein Behälter mit einem Wert darin. Also, was es bedeutet, zu Variable „passieren“? Und was ist der Unterschied zwischen primitiven und Referenzdatentypen.

Wir werden später mehr. Beginnen wir mit einer einfachen Zuordnung starten. Was macht diesen Code:

int х = 3;
int у = х;


In Zeile 1 erzeugt eine Variable x vom Typ int und es ist ein Wert von 3 zugewiesen
In Zeile 2, eine Variable y des Typs int und ihm den Wert der Variablen zuweisen x .

In Zukunft wird die Variable x hat keine Auswirkung auf y . Java kopiert den Wert von x (3) und legt diese Kopie in der Nähe .

Dieser Übertragungsparameter sinnvoll. Sie schreiben nicht eine Variable zu einem anderen. Der Wert wird kopiert und die neuen Variablen zugewiesen.

Der Ausdruck y = x; Bedeutet nicht , „schreiben x zu y “. Es bedeutet „den Wert in kopieren x und die Kopie schreiben aus “.

Wenn ich später ändern y :

у = 34;

Wird das die Auswirkungen auf x ? Natürlich nicht. x hat einen Wert von 3 fortzusetzen.

Wenn ich später ändern x :

х = 90;

Wie wird sich dies auf y ? Nichts. Sie haben nichts , nachdem die Zuordnung (Kopieren Werte) zu tun , wurde getan.

Was ist Referenztypen? Wie funktionieren sie?

Nicht so schwierig, in der Tat ist es in der Regel die gleiche. Links das gleiche tun - Sie eine Kopie der Referenz erhalten.

Also, wenn ich sage:

Cat A = new Cat ();
Cat B = A;

Link A wird auf den Link kopiert B . Die Anlage ist nicht wahr - Sie noch nur ein Objekt.
Aber jetzt haben Sie zwei verschiedene Links , die das gleiche Objekt steuern Cat .

Lassen Sie uns nun die Übertragung der Parameter auf die Methoden in Betracht ziehen.

Java übergibt Parameter nach Wert. Immer.
Das bedeutet - „den Wert kopieren und eine Kopie übertragen.“

Für primitive Typen, ist es einfach:

int х = 5;
doStuff (х); / / Передать копию х (значение 5) в метод doStuff

Verfahren doStuff wie folgt:

Lesen Sie mehr:   Google Maps OFFLINE HALTEN

void DoStuff (int у) {

/ / Действия с 'y'
}

Copy Wert x wird also 5 mit dem Verfahren übertragenes doStuff () .

Verfahren doStuff () hat seine eigene Variable namens y .
Die Variable y - die neuen, die anderen Variablen. Eine Kopie von dem, was in dem war x zum Zeitpunkt ihrer Übertragung auf das Verfahren. Von diesem Punkt an, in und x beeinflussen sich nicht gegenseitig. Bei einem Wechsel von , beeinflussen Sie nicht x .


void doStuff (int у) {

у = 27; / / Это не влияет на 'х'
}

Und umgekehrt - wenn Sie ändern x , ändern Sie y . Das einzige , was die gemacht x ist in diesem Fall den Wert zu kopieren und gab es das Verfahren doStuff () .

Als „von Wert passing“ arbeitet mit Links?

Zu viele Leute sagen: «Java geht Primitiven von Wert und Referenzobjekte.“ Es ist nicht so, wie sie sagen. Java geht alles von Wert. Mit einem primitiven, erhalten Sie eine Kopie des Inhalts. Mit Links erhalten Sie auch eine Kopie des Inhalts.

Aber was ist der Inhalt der Referenzen?

Fernbedienung. Die Mittel zur Steuerung / Zugriff auf das Objekt.

Wenn Sie ein Objekt Bezug auf eine Methode übergeben, sind vorbei Sie eine Kopie der Referenz. Fernbedienung Klon. Das Objekt sitzt immer noch in einem Stapel , wo er geschaffen wurde, wartet auf jemanden , um die Fernbedienung zu verwenden. Das Objekt kümmert sich nicht darum , wie viele Konsolen „programmiert“ , es zu kontrollieren. Es ist nur mit dem Garbage Collector besorgt, und Sie, den Programmierer.

Deshalb, wenn Sie sagen:

Cat A = new Cat ();
doStuff (А);

void DoStuff (Cat B) {

/ / Использование B
}

Es gibt nur ein Objekt Cat . Aber jetzt sind die beiden Fernbedienungen (Links) kann das gleiche Objekt zugreifen Cat .

Also jetzt , dass alle B macht das Objekt Katze , Einfluss auf die Katze , zeigte auf A , aber es wird nicht den Inhalt beeinflussen A !

Sie können die ändern Katze , die neue Verbindung mit Bed and (direkt kopiert A ), aber man kann es nicht ändern A .

Was zum Teufel soll das bedeuten?

Sie können die von referenzierte Objekt ändern A , aber man kann den Verweis nicht gehen und ändern A - umleiten es auf ein anderes Objekt oder null . Also , wenn Sie auf den Link ändern Bett und (nicht das Objekt selbst Cat verwiesen Bed and und den Wert von Links) Sie nicht den Wert ändern A . Umgekehrt.

Also:

Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

B = new Cat (); / / Не повлияет на ссылку A
}

Es bedeutet einfach , dass B Punkte auf ein anderes Objekt. Ein nach wie vor glücklich.

So sprecht mir nach:

Java geht alles von Wert.

(Okay, noch einmal ... mit Gefühl.)

Java geht alles von Wert.

Für primitive Typen - übergeben Sie eine Kopie des aktuellen Wertes für den Objektverweis - Sie übergeben eine Kopie der Referenz (Fernbedienung). Sie werden nie ein Objekt übergeben. Alle Objekte werden in einem Heap gespeichert. Immer.

Jetzt eine saftige brauen eine Tasse Kaffee und Code schreiben!

Original - Artikel.

in anderen Sprachen lesen

 BelorussianEnglisch Deutsch Spanisch Französisch Italienisch Portugiesisch Türkisch Arabisch Ukrainisch Schwedisch Ungarisch Bulgarisch Estnisch Chinesisch (vereinfacht) Vietnamesisch Rumänisch thailändisch Slowenisch Slowakisch serbisch malaiisch Norwegisch Lettisch Litauisch Koreanisch Japanisch Indonesier Hindi Hebräisch Finnisch Griechisch Holländisch Tschechisch Dänisch kroatisch Chinesisch (traditionell) Philippine Urdu Azeybardzhansky Armenischpolnisch Bengali georgisch Kasachisch Katalanisch Mongolski Russisch Tadzhitsky Tamil'skij telugu Uzbetsky

Kommentar hinzufügen

Ihre E-Mail wird nicht veröffentlicht. Erforderliche Felder sind markiert *