이것은 가장 흔히 볼 수 있는 인용 관계입니다. 변수 o는 new object()라는 대상(이하 대상 xx)을 인용합니다. o는 대상의 강한 인용을 가지고 있습니다. 메모리가 넘칠지언정 강한 인용의 메모리를 제거하지 않습니다.
Object obj = new Object();//o new xx // obj null, xx , , gc
obj = null;//help GC
obj를null로 설정한 경우 대상 xx에 대한 인용 처리를 계속하려면 다시 new 하나만 나올 수 있습니다. 이런 장면에서 jdk1.2 뒤에 자바가 하나 나왔어요.lang.ref 패키지는 대상의 생명주기에 대한 제어를 강화하는 동시에 자바의 내장 캐시로서 인용이 불가능한 상황에서도 사용할 수 있다
사용량이 적다 여러 인용 관계가 병존할 때 그것을 기준으로 할까요?강인용>소프트 인용>약인용>허인용은 당연히 강한 것을 위주로 한다. 예를 들어 앞 코드의obj가null이 아니라면obj가 소프트/약인용이 있어도 그 대상은 강인용이다.
GC 상호작용 원리
개인적인 추측에 의하면 gc 베이스 알고리즘에서 각종 서로 다른 인용에 대해 잘못된 알고리즘을 사용하고 서로 다른 GCroot에 대해 전략을 써서 gc와queue의 상호작용을 대할 것이다. Reference/ReferenceQue의 원본 코드를 봐도 GC가 왜 데이터를queue에 버렸는지 모르겠다. Reference의 수호 라인은 상태를 바꾸는 것일 뿐이고 GC 베이스 알고리즘이기도 하다.
WeakHashMap
이름을 보면 약한 인용과 큰 관계가 있음을 알 수 있습니다. 많은 프레임워크가 이 맵 내부의 Entry를 사용하여 하나를 유지하는 것을 발견했습니다.
/**
* The entries in this hash table extend WeakReference, using its main ref
* field as the key.
*/privatestaticclassEntry<K,V> extendsWeakReference<Object> implementsMap.Entry<K,V> {
V value;
finalint hash;
Entry next;
/**
* Creates new entry.
*/
Entry(Object key, V value,
ReferenceQueue queue,
int hash, Entry next) {
super(key, queue);
// key key null value this.value = value;
this.hash = hash;
xt = next;
}}
*
/**
* Expunges stale entries from the table.get/size map
*/privatevoidexpungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
//queue.poll() queue x, map key map entry
}
참고 자료https://blog.csdn.net/coolwxb/article/details/7939246
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: