>  기사  >  Java  >  Java 약한 참조 이해 및 사용

Java 약한 참조 이해 및 사용

(*-*)浩
(*-*)浩원래의
2019-11-28 13:16:372402검색

Java 약한 참조 이해 및 사용

Java에서는 객체가 생성되면 메모리 힙에 배치됩니다. GC가 실행될 때 객체를 가리키는 참조가 없으면 객체를 재활용하여 메모리 공간을 확보합니다.

즉, 객체를 재활용하려면 두 가지 조건이 충족되어야 합니다.

1) 이를 가리키는 참조가 없습니다. (권장 학습: java 코스)

2) GC가 실행됩니다.

Java에서는 간단한 상황의 경우 프로그래머가 수동으로 이를 비워 둘 필요가 없습니다. 왜냐하면 Java에서는 간단한 개체의 경우 이를 호출하는 메서드가 실행될 때 이를 가리키는 참조가 GC에 의해 재활용되기 때문입니다.

실제로 코드를 작성할 때 다음과 같이 특정 객체를 가리키는 모든 참조를 null로 설정하는 경우가 많습니다.

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

분명히 null 객체를 수동으로 설정하는 것은 프로그래머에게 번거롭고 자동 재활용 메커니즘을 위반합니다.

메서드에서 생성된 로컬 개체와 같은 간단한 상황에서는 Java를 호출하는 메서드가 실행될 때 이를 가리키는 참조가 GC에 의해 재활용됩니다.

캐시 사용과 같은 더 복잡한 상황에서는 캐시에 있는 개체가 정확히 프로그램을 실행하는 데 필요한 것이므로 프로그램이 실행되는 한 캐시에 있는 참조는 GC되지 않습니다. 캐시에 참조가 점점 더 많아지고, GC로 재활용할 수 없고 자동으로 재활용할 수 없는 객체가 점점 더 많아지고 있습니다. 이때 개발자는 재활용을 처리해야 하며 이는 명백히 Java 자동 재활용 메커니즘을 위반합니다.

이에 대응하여 Java에는 약한 참조(WeakReference)가 도입되었습니다.

다른 강한 참조 없이 약한 참조로만 개체를 ​​가리키는 경우 GC가 실행되면 개체가 재활용됩니다. 강력한 참조가 존재하고 이와 연결되어 있으면 가비지 수집 중에 개체가 회수되지 않습니다.

WeakReference의 구문:

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

약한 참조가 참조하는 개체를 얻으려면 먼저 해당 개체가 재활용되었는지 여부를 확인해야 합니다.

weakReference.get();

이 메서드가 비어 있으면 개체가 약한 참조가 가리키는 것이 재활용되었습니다.

다음은 WeakReference의 예입니다.

Person 클래스:

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;
    }
}

Test 클래스 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;
            }
        }
    }
}

실행 결과:

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.

보시다시피 while 루프 후 처형된 수만 번 p가 재활용되었습니다.

프로그램을 여러 번 테스트하고 실행한 결과 p 재활용 중 루프 실행 횟수가 불확실한 것으로 나타났습니다. 이는 GC 작업의 불확실성에 의해 결정되기 때문입니다.

요약:

1. Java에서 객체가 약한 참조로만 참조되는 경우 GC가 실행되면 객체가 재활용됩니다.

2. 약한 참조의 한 가지 특징은 언제 재활용될지 불확실하다는 것입니다.

위 내용은 Java 약한 참조 이해 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.