Java: strong/soft/weak/phantom 참조의 차이
Java의 다양한 레퍼런스(strong, soft, weak, pantom)에 대해 이 기사를 읽었는데 잘 모르겠습니다.
이들 레퍼런스 타입의 차이는 무엇이며, 각 타입은 언제 사용됩니까?
Java는 strong과 weak의 두 가지 유형의 참조 개체를 제공합니다.약한 기준 개체는 소프트와 팬텀으로 더 나눌 수 있습니다.
- 강한.
- 약한
- 부드러운
- 팬텀
한 사람 한 사람씩.
강력한 참조 객체
StringBuilder builder = new StringBuilder();
달리 지정되지 않은 경우 참조 개체의 기본 유형/클래스가 다음과 같습니다.builder는 강력한 참조 객체입니다.이러한 종류의 참조는 참조된 개체를 GC에 적용할 수 없게 합니다.즉, 강력한 참조 개체 체인이 개체를 참조할 때마다 가비지 수집이 불가능합니다.
취약한 참조 개체
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);
취약한 참조 개체는 참조 개체의 기본 유형/클래스가 아니므로 위의 예시와 같이 명시적으로 지정해야 합니다.이러한 종류의 참조는 참조 객체를 GC에 적용할 수 있게 합니다.즉, 에 도달할 수 있는 유일한 레퍼런스가 있는 경우StringBuilder메모리 내의 오브젝트는 실제로는 약한 참조입니다.그러면 GC는 가비지 수집을 할 수 있습니다.StringBuilder물건.메모리의 개체에 취약한 참조 개체만 연결할 수 있는 경우 GC에 자동으로 적합합니다.
약점 수준
소프트와 팬텀의 두 가지 다른 약점 레벨을 적용할 수 있습니다.
소프트 레퍼런스 오브젝트는 기본적으로 메모리에 조금 더 남아 있는 약한 레퍼런스 오브젝트입니다.일반적으로 메모리를 사용할 수 없을 때까지 GC 사이클에 저항합니다.OutOfMemoryError(이 경우 제거할 수 있습니다).
한편, 팬텀 레퍼런스 오브젝트는 오브젝트가 메모리에서 효과적으로 삭제되었을 때에만 도움이 됩니다.보통 오브젝트는 오브젝트 자체를 반환하지 않고 메모리 존재만 추적하기 때문에 이상한 finalize() 부활/부활 동작을 수정하기 위해 사용됩니다.
취약한 참조 개체는 캐시 모듈을 구현하는 데 이상적입니다.실제로 객체/값이 강력한 참조 체인으로 도달할 수 없을 때마다 GC가 메모리 영역을 청소할 수 있도록 함으로써 일종의 자동 제거를 구현할 수 있습니다.예를 들어 약한 키를 유지하는 WeakHashMap이 있습니다.
취약한 참조:
간단히 말해서 약한 참조란 어떤 대상을 강제로 기억하게 할 만큼 충분히 강하지 않은 참조입니다.취약한 참조를 사용하면 가비지 컬렉터의 도달 가능성을 확인할 수 있으므로 사용자가 직접 수행할 필요가 없습니다.
소프트 레퍼런스:
소프트 레퍼런스는 자신이 참조하는 오브젝트를 폐기하는 데 덜 열심이라는 점을 제외하면 약한 레퍼런스와 똑같습니다.도달 가능성이 약한 오브젝트(가장 강한 참조는 WeakReferences)는 다음 가비지 수집 사이클에서 폐기되지만 일반적으로 도달 가능성이 낮은 오브젝트는 잠시 동안 유지됩니다.
팬텀 레퍼런스:
팬텀 레퍼런스는 SoftReference 또는 WeakReference와 상당히 다릅니다.오브젝트 그립이 너무 약해서 오브젝트를 취득할 수 없습니다.get() 메서드는 항상 null을 반환합니다.이러한 참조의 유일한 용도는 ReferenceQueue에 큐잉된 시점을 추적하는 것입니다.이 시점에서 참조가 가리키는 객체가 비활성 상태임을 알 수 있습니다.
이 텍스트는 다음에서 발췌되었습니다.https://weblogs.java.net/blog/2006/05/04/understanding-weak-references
단순한 차이점SoftReference그리고.WeakReference는 Android Developer에서 제공합니다.
의 차이점SoftReference및 aWeakReference는 참조를 클리어하고 큐잉하기 위한 결정이 내려지는 시점입니다.
A
SoftReferenceVM의 메모리가 부족할 위험이 있는 경우에는 가능한 한 늦게 클리어하고 큐잉해야 합니다.A
WeakReference는 약하게 보강된 것으로 판명되는 즉시 클리어 및 큐잉될 수 있습니다.
이 문서는 강하고, 부드럽고, 약하고, 팬텀적인 참조를 이해하는 데 매우 도움이 될 수 있습니다.
요약하자면
오브젝트에 대한 강한 참조가 있는 경우 오브젝트는 GC(Garbage Collector)에 의해 수집/리콜 할 수 없습니다.
오브젝트에 대한 참조가 약한 경우(강력한 참조가 없는 경우), 오브젝트는 다음 GC 사이클에서 GC에 의해 회수됩니다.
개체에 대한 소프트 참조만 있는 경우(강력한 참조는 없음), JVM의 메모리가 부족할 때만 GC에 의해 개체가 회수됩니다.
We create phantom references to an object to keep track of when the object gets enqueued into the ReferenceQueue. Once you know that you can perform fine-grained finalization. (This would save you from accidentally resurrecting the object as phantom-reference don't give you the referrant). I'd suggest you reading this article to get in-depth detail about this.
So you can say that, strong references have ultimate power (can never be collected by GC)
Soft references are powerful than weak references (as they can escape GC cycle until JVM runs out of memory)
Weak references are even less powerful than soft references (as they cannot escape any GC cycle and will be reclaimed if object have no other strong reference).
Restaurant Analogy
- Waiter - GC
- You - Object in heap
- Restaurant area/space - Heap space
- New Customer - New object that wants table in restaurant
Now if you are a strong customer (analogous to strong reference), then even if a new customer comes in the restaurant or what so ever happnes, you will never leave your table (the memory area on heap). The waiter has no right to tell you (or even request you) to leave the restaurant.
If you are a soft customer (analogous to soft reference), then if a new customer comes in the restaurant, the waiter will not ask you to leave the table unless there is no other empty table left to accomodate the new customer. (In other words the waiter will ask you to leave the table only if a new customer steps in and there is no other table left for this new customer)
If you are a weak customer (analogous to weak reference), then waiter, at his will, can (at any point of time) ask you to leave the restaurant :P
The three terms that you have used are mostly related to Object's eligibility to get Garbage collected .
Weak Reference :: Its a reference that is not strong enough to force the object to remain in memory . Its the garbage collector's whims to collect that object for garbage collection. You can't force that GC not to collect it .
Soft Reference :: Its more or less same like the weak reference . But you can say that it holds the object a bit more strongly than the weak reference from garbage collection.
가비지 수집기가 첫 번째 라이프 사이클 자체에서 취약한 참조를 수집하면 다음 가비지 수집 사이클에서 소프트 참조를 수집합니다.
Strong Reference : 위의 두 가지 레퍼런스와는 정반대입니다.쓰레기는 수집되지 않습니다(대부분은 수집되지 않습니다).
상세한 것에 대하여는, 다음의 링크를 참조해 주세요.
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html
4도 기준 -Strong, Weak, Soft, Phantom
Strong - 참조된 개체를 GC. Builder 클래스에 적합하지 않게 만드는 참조의 일종입니다.예: String Builder
Weak - GC에 적합한 기준입니다.
Soft - 메모리를 사용할 수 있을 때까지 오브젝트가 GC에 적합한 참조의 일종입니다.이미지 캐시에 최적.메모리를 사용할 수 있을 때까지 보관합니다.
팬텀 - 개체가 직접 GC에 적합한 참조의 일종입니다.오브젝트가 메모리에서 삭제되었을 때만 사용됩니다.
용도:
개체가 메모리에서 정확히 제거된 시기를 식별할 수 있습니다.
언제
finalize()메서드가 오버로드되면 두 클래스의 GC 적격 오브젝트에 대해 GC가 시기적절하게 실행되지 않을 수 있습니다.따라서 팬텀 레퍼런스에 의해 GC에 가입할 수 있게 됩니다.finalize()따라서 대부분의 힙이 가비지 상태에서도 Out Of Memory Errors를 얻을 수 있습니다.
캐시 모듈을 구현하려면 약한 참조가 이상적입니다.
강력한 레퍼런스
다음은 매일 코드화하는 일반 객체 참조입니다.
Employee emp = new Employee();
변수 "emp"는 Employee 개체에 대한 강력한 참조를 가지고 있으며 강력한 참조 체인을 통해 도달할 수 있는 개체는 가비지 수집에 적합하지 않습니다.보통, 이것은 당신이 원하는 것이지만 항상 그런 것은 아니다.이제 컬렉션 또는 맵에서 데이터베이스에서 많은 직원을 가져오고 정기적으로 많은 직원을 처리해야 한다고 가정합니다. 따라서 성능을 유지하기 위해 캐시에 직원을 보관합니다.
이 방법은 좋지만 이제 다른 데이터가 필요하며 이러한 Employee 개체는 필요하지 않습니다. 이러한 개체는 캐시를 제외한 다른 곳에서도 참조되지 않습니다.이러한 개체는 사용 중이 아니지만 가비지 컬렉션에 적합하지 않고 참조가 없기 때문에 캐시에서 해당 개체를 제거할 수 없기 때문에 메모리 누수가 발생하는 이유는 무엇입니까?따라서 전체 캐시를 수동으로 비워야 하므로 번거롭거나 다른 종류의 참조를 사용할 수 있습니다.취약한 레퍼런스
취약한 레퍼런스
약한 참조는 개체를 메모리에 고정하지 않으며 다른 참조에서 참조되지 않으면 다음 GC 사이클에서 GC'd가 됩니다.Java에 의해 제공되는 WeakReference 클래스를 사용하여 위의 종류의 캐시를 만들 수 있습니다. 캐시는 다른 곳에서 참조되지 않은 개체를 저장하지 않습니다.
WeakReference<Cache> cache = new WeakReference<Cache>(data);
데이터에 액세스하려면 cache.get()을 호출해야 합니다.약한 참조가 가비지 수집되었을 경우 이 취득 콜은 늘을 반환할 수 있습니다.NPE를 회피하려면 반환된 값을 확인해야 합니다.Java는 약한 참조를 사용하는 컬렉션을 제공합니다. 예를 들어, WeakHashMap 클래스는 키가 아닌 것을 약한 참조로 저장합니다.키가 GC'd일 경우 지도에서도 값이 자동으로 삭제됩니다.
약한 참조도 객체이므로 이를 정리하는 방법이 필요합니다(참조 대상 객체가 GC'd인 경우 더 이상 유용하지 않습니다).취약한 참조를 위해 ReferenceQue를 컨스트럭터에 전달하면 가비지 컬렉터가 완료되거나 GC'd되기 전에 해당 취약한 참조를 ReferenceQue에 추가합니다.이 큐를 정기적으로 처리하여 데드 레퍼런스를 처리할 수 있습니다.
소프트 레퍼런스
SoftReference는 WeakReference와 비슷하지만 가비지가 수집될 가능성은 낮습니다.소프트 레퍼런스는 메모리 요구에 따라 가비지 컬렉터의 재량에 따라 클리어 됩니다.가상 시스템은 Out Of Memory Error를 발생시키기 전에 소프트 도달 가능한 개체에 대한 모든 소프트 참조가 지워졌는지 확인합니다.
팬텀 레퍼런스
팬텀 참조는 모든 참조 유형 중 가장 약하며, get on을 호출하면 항상 null이 반환됩니다.오브젝트가 완료된 후 할당된 메모리가 회수되기 전에 오브젝트가 팬텀 참조됩니다.완료되기 전에 큐에 들어가는 약한 참조와 달리 GC'd 팬텀 참조는 거의 사용되지 않습니다.
그럼 그것들은 어떻게 유용할까요?팬텀 참조를 구성할 때는 항상 ReferenceQueue를 전달해야 합니다.이는 팬텀 참조를 사용하여 객체가 GC'd인지 확인할 수 있음을 나타냅니다.
약한 참조가 최종으로 간주되지만 아직 GC가 아닌 경우 큐잉되면 최종자 블록에 오브젝트에 대한 새로운 강력한 참조를 생성하여 오브젝트가 GC'd가 되지 않도록 할 수 있습니다.네, 할 수 있지만 이러면 안 될 것 같아.이 경우를 확인하려면 해당 개체가 팬텀 참조로만 도달할 수 없는 경우를 제외하고 각 개체에 대해 GC 사이클이 두 번 이상 발생합니다.따라서 메모리에 가비지가 많이 포함되어 있어도 힙이 부족할 수 있습니다.팬텀 참조로 인해 이를 방지할 수 있습니다.
자세한 내용은 제 기사 Types of References in Java(Strong, Soft, Weak, Phantom)를 참조하십시오.
언급URL : https://stackoverflow.com/questions/9809074/java-difference-between-strong-soft-weak-phantom-reference
'programing' 카테고리의 다른 글
| 'createElement' 기능을 사용할 때 소품 바인딩을 반응적으로 만드는 방법 (0) | 2022.07.06 |
|---|---|
| VueJ의 v-for에서 반복 요소 제거s (0) | 2022.07.06 |
| 페이지를 새로 고치지 않으면 데이터 탭의 데이터가 삭제되지 않는 이유는 무엇입니까? (0) | 2022.07.06 |
| 동일한 코드베이스를 사용하여 동일한 페이지에 여러 Vue 인스턴스 표시 (0) | 2022.07.06 |
| VueJ 2에서 사용자 생성 및 편집에 동일한 사용자 양식 구성 요소를 사용하는 방법 (0) | 2022.07.06 |