Heim >Java >javaLernprogramm >Schwache Java-Referenzen verstehen und verwenden

Schwache Java-Referenzen verstehen und verwenden

(*-*)浩
(*-*)浩Original
2019-11-28 13:16:372445Durchsuche

Schwache Java-Referenzen verstehen und verwenden

Wenn in Java ein Objekt erstellt wird, wird es im Speicherheap abgelegt. Wenn beim Ausführen des GC festgestellt wird, dass kein Verweis auf das Objekt vorhanden ist, wird das Objekt angezeigt wird recycelt, um Speicherplatz freizugeben.

Oder mit anderen Worten, damit ein Gegenstand recycelt werden kann, müssen zwei Bedingungen erfüllt sein:

1) Es gibt keinen Verweis darauf (empfohlenes Lernen: Java-Kurs )

2) GC wird ausgeführt.

Für einfache Situationen in Java müssen Programmierer es nicht manuell leer setzen, da in Java bei einfachen Objekten die Referenz, die darauf verweist, von GC recycelt wird, wenn die Methode, die es aufruft, ausgeführt wird.

Tatsächlich setzen wir beim Schreiben von Code oft alle Referenzen, die auf ein bestimmtes Objekt verweisen, auf Null, wie zum Beispiel:

Person p = new Person("张三",18,"男");//强引用
...
p=null;//不再使用的时候置null

Für Programmierer ist das manuelle Festlegen von Nullobjekten offensichtlich umständlich und verstößt gegen den automatischen Recyclingmechanismus.

In einfachen Situationen, wie z. B. in Methoden generierten lokalen Objekten, müssen Programmierer diese in Java nicht manuell leeren. Wenn die Methode, die sie aufruft, ausgeführt wird, wird die darauf verweisende Referenz von GC recycelt.

In einer komplizierteren Situation, z. B. bei der Verwendung des Caches, werden die Referenzen im Cache nicht GCed, da die Objekte im Cache genau das sind, was das Programm zum Ausführen benötigt, solange das Programm ausgeführt wird , also wie die Referenzen im Cache Es gibt immer mehr Objekte, die nicht von GC recycelt werden können und nicht automatisch recycelt werden können. Zu diesem Zeitpunkt müssen sich Entwickler um das Recycling kümmern, was offensichtlich gegen den automatischen Recyclingmechanismus von Java verstößt.

In diesem Zusammenhang wurden in Java schwache Referenzen (WeakReference) eingeführt.

Wenn auf ein Objekt nur durch eine schwache Referenz ohne eine andere starke Referenz verwiesen wird und der GC ausgeführt wird, wird das Objekt recycelt. Wenn ein starker Verweis vorhanden und damit verknüpft ist, wird das Objekt während der Garbage Collection nicht zurückgefordert.

Die Syntax von WeakReference:

WeakReference<T> weakReference = new WeakReference<T>(referent);

Wenn Sie das durch die schwache Referenz referenzierte Objekt erhalten möchten, müssen Sie zunächst feststellen, ob es recycelt wurde:

weakReference.get();

Wenn diese Methode leer ist, bedeutet dies, dass das Objekt, auf das schwache Referenz zeigt, recycelt wurde.

Das Folgende ist ein Beispiel für WeakReference:

Personenklasse:

package com.yx.test.model;
 
/**
 * Person
 *
 * @author yx
 * @date 2019/11/26 16:28
 */
public class Person {
    private String name;
    private int age;
    private String sex;
 
    public Person() {
    }
 
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getSex() {
        return sex;
    }
 
    public void setSex(String sex) {
        this.sex = sex;
    }
}

Testklasse TestWeakReference:

package com.yx.test.reference;
 
import com.yx.test.model.Person;
 
import java.lang.ref.WeakReference;
 
/**
 * TestWeakReference
 *
 * @author yx
 * @date 2019/11/26 16:30
 */
public class TestWeakReference {
    public static void main(String[] args) {
        Person p = new Person("张三",18,"男");
        WeakReference<Person> weakPerson = new WeakReference<Person>(p);
        int i=0;
        while(true){
            if(weakPerson.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakPerson);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }
    }
}

Betriebsergebnisse:

p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4
...
p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4
p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4
p has been collected.

Wie Sie sehen können, wird p recycelt, nachdem die while-Schleife zehntausende Male ausgeführt wurde.

Habe das Programm mehrmals getestet und festgestellt, dass die Anzahl der Schleifenausführungen während des p-Recyclings unsicher ist, da dies durch die Unsicherheit des GC-Betriebs bestimmt wird.

Zusammenfassung:

1. Wenn in Java ein Objekt nur durch eine schwache Referenz referenziert wird und der GC ausgeführt wird, wird das Objekt recycelt.

2. Eines der Merkmale einer schwachen Referenz ist, dass es ungewiss ist, wann sie recycelt wird

Das obige ist der detaillierte Inhalt vonSchwache Java-Referenzen verstehen und verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn