Java의 참조 유형에는 1. 강력한 참조, 2. 소프트 참조, 3. 약한 참조,
Java의 참조 유형
일반적으로 Java 유형에는 기본 데이터 유형과 참조 데이터 유형의 두 가지 유형이 있습니다. 그 중 참조 데이터 유형은 스토리지 힙에서 참조해야 하는 객체를 의미합니다. 참조는 Java 객체 지향의 특징입니다.
JDK1.2부터 Java의 참조 유형은 4가지 유형으로 구분됩니다.
StrongReference이런 종류의 참조는 Stringstrong=newString("StrongReference")과 같이 일상적인 개발에서 가장 일반적으로 사용됩니다. 인스턴스 객체에 강력한 참조가 있으면 가비지 수집기가 이를 재활용하지 않습니다. 메모리가 부족하면 강력 참조 객체를 재활용하는 것보다 OutOfMemeryError 예외가 발생합니다. 왜냐하면 JVM은 강력 참조 객체가 사용자가 사용 중인 객체라고 생각하고 어떤 객체를 강제로 재활용해야 하는지 알 수 없기 때문입니다. 시스템에 심각한 오류가 발생할 수 있습니다.
Soft Reference-SoftReference객체에 소프트 참조만 있는 경우 JVM은 메모리가 부족한 경우에만 객체를 재활용하고 다른 경우에는 재활용하지 않습니다. 소프트 참조는 ReferenceQueue와 함께 사용될 수 있습니다. 시스템 메모리가 부족하여 소프트 참조 객체가 재활용되면 JVM은 연관된 ReferenceQueue에 소프트 참조를 추가합니다.
ReferenceQueuereferenceQueue=newReferenceQueue(); SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue); Bookbook=softReference.get(); Referencereference=referenceQueue.poll();
시스템 메모리가 부족하면 gc가 트리거되고 Book이 재활용되며 참조는 null이 아닙니다.
약한 참조-WeakReference
약하게 참조된 객체만 있습니다. JVM이 GC를 트리거하면 객체가 재활용됩니다. 소프트 참조와 달리 약한 참조는 메모리 부족 여부에 관계없이 재활용됩니다. 약한 참조는 ReferenceQueue와 함께 사용될 수 있습니다. 시스템이 gc를 트리거하고 소프트 참조 객체가 재활용되면 JVM은 연관된 ReferenceQueue에 약한 참조를 추가하므로 가비지 수집기 스레드의 우선 순위는 매우 낮습니다. 약한 참조는 빠르게 재활용되지 않을 수 있습니다. 다음은 이 결론을 확인하기 위해 적극적으로 gc를 트리거하는 예입니다.
ReferenceQueuereferenceQueue=newReferenceQueue(); WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue); Bookbook=softReference.get(); System.gc(); //Runtime.getRuntime().gc(); Referencereference=referenceQueue.poll();물론 매번 재현할 수는 없습니다. JVM에 가비지 수집 시간임을 알리기 위해 System.gc()를 호출하기 때문입니다. 그러나 언제 수행할지는 확실하지 않습니다. System.gc()를 여러 번 시도한 후에도 재발 확률은 여전히 매우 높습니다.
Virtual Reference-PhantomReference
객체에 이를 참조하는 팬텀 참조만 있는 경우 가비지 수집기는 언제든지 해당 객체를 재활용할 수 있습니다. 팬텀 참조는 주로 가비지에서 재활용되는 객체의 활동을 추적하는 데 사용됩니다. 재활용되면 JVM은 이 약한 참조를 연관된 ReferenceQueue에 추가합니다.
소프트 참조 및 약한 참조와 달리 가상 참조에는 연관된 ReferenceQueue가 있어야 합니다. phantomReference.get()을 통해 얻은 값은 null입니다. 연관된 ReferenceQueue가 없으면 어떤 값이 있습니까? 모직물?
PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue); Bookbook=phantomReference.get();//此值为null Referencereference=referenceQueue.poll();
추천 튜토리얼: "java tutorial"
위 내용은 Java 참조 유형이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!