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 중국어 웹사이트의 기타 관련 기사를 참조하세요!