자바에서의 네 가지 인용 방식의 차이에 대해 간단히 말하다
강조 참조(StrongReference)
강인용은 프로그램 코드에 보편적으로 존재하는 것을 가리킨다. 예를 들어 아래 코드의object와str는 모두 강인용이다.
Object object = new Object();
String str = "hello";
어떤 대상이 강한 인용과 관련이 있다면 JVM은 반드시 이 대상을 회수하지 않을 것이다. 메모리가 부족한 상황에서도 JVM은 차라리 OutOfMemory 오류를 내더라도 이런 대상을 회수하지 않을 것이다.예를 들어 아래의 코드:
public class Main {
public static void main(String[] args) {
new Main().fun1();
}
public void fun1() {
Object object = new Object();
Object[] objArr = new Object[1000];
}
}
Object[]objArr=new Object[1000]로 실행할 때이 문장에서 메모리가 부족하면 JVM은 OOM 오류를 내거나 object가 가리키는 대상을 회수하지 않습니다.그러나 주의해야 할 것은fun1이 실행된 후에object와objArr는 존재하지 않기 때문에 그들이 가리키는 대상은 모두 JVM에 의해 회수된다는 것이다.강제 인용과 대상 간의 연결을 끊으려면 인용 값을null로 표시할 수 있습니다. 그러면 JVM은 적당한 시간에 이 대상을 회수합니다.
소프트 참조(SoftReference)
소프트 인용은 유용하지만 필요한 대상을 설명하는 데 사용되며, 자바에서java를 사용합니다.lang.ref.SoftReference 클래스로 표시됩니다.소프트 참조와 연관된 객체의 경우 메모리가 부족할 때만 JVM이 객체를 회수합니다.따라서 이 점은 OOM 문제를 해결하는 데 잘 사용할 수 있고 이 특성은 캐시를 실현하는 데 적합하다. 예를 들어 웹 캐시, 그림 캐시 등이다.
소프트 참조는 참조 대기열(ReferenceQueue)과 함께 사용할 수 있으며, 소프트 참조가 참조하는 객체가 JVM에서 회수되면 연관된 참조 대기열에 추가됩니다.다음은 사용 예제입니다.
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
System.out.println(sr.get());
System.gc(); // JVM gc
System.out.println(sr.get());
}
}
약참조(WeakReference)비필수 객체에 대한 약참조는 JVM이 스팸 복구를 수행할 때 메모리가 충분한지 여부와 관계없이 약참조와 연관된 객체를 회수하는 비필수 객체를 설명하는 데 사용됩니다.자바에서 자바를 사용합니다.lang.ref.WeakReference 클래스로 표시됩니다.다음은 사용 예제입니다.
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
System.out.println(sr.get());
System.gc(); // JVM gc
System.out.println(sr.get());
}
}
거짓 참조(PhantomReference)허인용은 앞의 소프트인용, 약인용과 달리 대상의 생명주기에 영향을 주지 않는다.자바에서 자바를 사용하세요.lang.ref.PhantomReference 클래스는만약 대상이 허위 인용과 관련이 있다면, 인용이 없는 것과 마찬가지로 언제든지 쓰레기 수거기에 회수될 수 있다.
주의해야 할 것은 인용 대기열과 연결되어 사용해야 한다는 것이다. 쓰레기 수거기가 대상을 회수하려고 할 때, 인용이 있는 것을 발견하면 이 인용을 인용 대기열에 추가한다.프로그램은 인용 대기열에 허위 인용이 들어갔는지 판단함으로써 인용된 대상이 쓰레기로 회수될지 여부를 알 수 있다.만약 프로그램이 인용 대기열에 허위 인용이 추가된 것을 발견한다면, 인용된 대상의 메모리가 회수되기 전에 필요한 행동을 취할 수 있습니다.
소프트 인용과 약한 인용을 한층 더 이해하다
강제 인용에 대해 우리는 평소에 코드를 작성할 때 자주 사용한다.다른 세 가지 유형의 인용에 대해 가장 많이 사용되는 것은 소프트 인용과 약한 인용인데 이 두 가지는 비슷한 점도 있고 차이점도 있다.필수 객체는 아니지만 소프트 참조에 의해 연관된 객체는 메모리가 부족할 때만 재활용되고 약한 참조에 의해 연관된 객체는 JVM에서 쓰레기 수거할 때 재활용됩니다.위의 특성에 따라 소프트 참조는 캐시에 적합합니다. 메모리가 부족할 때 JVM이 메모리를 회수할 수 있고, 약한 참조는 리셋 함수에서 메모리 유출을 방지할 수 있습니다.리셋 함수는 흔히 익명 내부 클래스이기 때문에 외부 클래스에 대한 인용이 은밀하게 저장되어 있기 때문에 리셋 함수가 다른 라인에서 리셋되고 이때 외부 클래스를 회수해야 한다면 메모리가 유출된다. 왜냐하면 익명 내부 클래스는 외부 클래스에 대한 강한 인용이 저장되어 있기 때문이다.
위의 자바에서 언급한 네 가지 인용 방식의 차이점은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.