1. 참조 유형 (강한 참조 제외)
참조의 직접 서브 클래스는 JVM에 의해 처리된다는 것을 이해할 수 있으므로 코드의 참조 유형을 직접 상속하는 데 영향을 미치지 않습니다. 서브 클래스에서만 상속 될 수 있습니다. 해당 서브 클래스 유형에는 다음이 포함됩니다. (Jnireference와 같이 Java에서 사용되지 않은 것을 무시하십시오)
소프트로 회의
약한 참조
최종 평가
공학적 회의
상기 참조 유형은 해당 Javadoc에서도 언급되어 있습니다. FinalReference는 Finalize 메소드를 위해 특별히 설계되었으며 다른 특정 응용 프로그램 시나리오가 있습니다. 그중에서도 Softreference는 메모리 관련 캐시에 사용되며, 약점은 재활용과 관련된 대부분의 시나리오에서 사용됩니다. Phantomreference는 콜백 시나리오에서 개체 재활용을위한 콜백 시나리오에서 사용됩니다 (예 : 리소스 누설 감지).
IDE의 여러 유형의 서브 클래스 정보를 직접보고 해당 유형을 상속하여 대부분의 프레임 워크에서 사용되는 시나리오를 이해하여 실제로 유형 선택 프로세싱을 수행 할 수 있습니다.
2. 참조 생성자
내부적으로 두 개의 생성자를 제공합니다. 하나는 큐가 있고 다른 하나는 대기열이 없습니다. 큐의 의미는이 큐를 외부에서 모니터링 할 수 있다는 것입니다. 즉, 객체를 재활용하려는 경우 해당 참조 객체 가이 대기열에 배치됩니다. 참조를 얻을 때 더 많은 거래를 할 수 있습니다.
그렇지 않은 경우 참조 객체 만 지속적으로 훈련하고 내부가 널 리턴 여부를 판단 할 수 있습니다 (Phantomreference 객체는이 작업을 수행 할 수없고 Get은 항상 NULL을 반환하므로 대기열이있는 생성자 만 있습니다). 두 방법 모두 실제 응용 프로그램에 따라 해당 사용 시나리오가 있습니다. 예를 들어, 약한 해쉬 맵에서는 큐 데이터를 쿼리하여 객체가 재활용되는지 여부를 결정하도록 선택합니다. ThreadLocalMap의 경우 get ()가 처리를 위해 null인지 여부를 결정하는 데 사용됩니다.
해당 생성자는 다음과 같습니다.
참조 (t reference) {this (참조, null);} 참조 (t reference, referencequeue <? super t> queue) {this.referent = 참조; this.queue = (queue == null)? referencequeue.null : 대기열;}여기의 널 큐는 큐에서 데이터를 처리 할 필요가없는 대기열로 이해할 수 있습니다. 그리고 그 안에는 데이터에 액세스하지 않습니다.
위의 객체에서, 참조는 참조하는 객체, 즉 우리가 그것을 구성 할 때 우리가 래핑 해야하는 객체를 나타냅니다. 객체가 재활용 될 것이라는 정의는이 객체가 참조를 제외하고는 다른 참조가 없음을 의미합니다 (실제로 참조되지는 않지만 Gcroot 접근성은 순환 참조 문제를 피하기 위해 도달 할 수 없습니다).
대기열은 객체를 재활용 할 때 알림을받을 대기열입니다. 객체가 재활용되면 전체 기준 객체 (재활용 객체가 아닌)가 큐에 배치 된 다음 외부 프로그램 이이 대기열을 모니터링하여 해당 데이터를 얻을 수 있습니다.
3. 참조 큐 및 참조 참조 체인
여기의 대기열은 명목상 대기열이지만 내부에는 실제 저장 구조가 없습니다. 스토리지는 내부 노드 간의 관계에 달려 있습니다. 큐는 링크 된 목록과 유사한 구조이며 여기의 노드는 실제로 참조 자체라는 것을 이해할 수 있습니다. 큐는 현재 헤드 노드 만 저장하는 링크 된 목록의 컨테이너이며, 후속 노드는 각 참조 노드 자체에 의해 다음을 통해 유지된다는 것을 이해할 수 있습니다.
참조 상태 값
각 참조 객체에는 해당 상태 설명이 있습니다. 즉, 쿼리, 위치 또는 처리의 편의를 위해 자체와 현재 래핑 된 오브젝트를 설명합니다.
1. Active : 활성 상태, 즉 해당 객체는 강력한 기준 상태이며 재활용되지 않았습니다. 이 상태에서는 객체가 큐에 배치되지 않습니다. 이 상태에서 다음은 NULL이며, 대기열은 정의 될 때 참조 된 대기열입니다.
2. 보류 : 대기열에 넣을 준비를합니다. 이 상태에서 처리 할 객체는 대기열에 하나씩 대기열됩니다. 이 시간 동안 해당 객체는 보류 상태에 있습니다. 어떤 참조에 관계없이,이 상태에 들어가면 해당 상태에서 다음 자체가 JVM에 의해 설정되어 있고 큐는 정의 될 때 큐가 참조된다고 생각할 수 있습니다.
3. Enqueued : 해당 객체는 이미 재활용되어야하며 해당 참조 객체가 큐에 배치되었습니다. 외부 스레드는 해당 데이터를 얻기 위해 큐를 쿼리 할 준비가되었습니다. 이 상태에서 다음은 처리 할 다음 객체이며 대기열은 특수 식별 객체입니다.
4. 비활성 : 즉,이 객체는 외부에서 줄에서 검색되었으며 처리되었습니다. 즉,이 참조 객체를 재활용 할 수 있고 내부적으로 캡슐화 된 객체도 재활용 할 수 있음을 의미합니다 (실제 재활용 작업은 명확한 동작이 호출되는지 여부에 따라 다릅니다). 이 상태에 들어가는 사람들은 재활용되어야한다는 것을 이해할 수 있습니다.
JVM은 해당 참조가있는 상태를 결정하기 위해 상태 값을 정의 할 필요가 없습니다. 다음에 계산하기 만하면 큐를 계산하면됩니다.
4. ReferenceQueue#헤드
현재 큐에서 처리 할 최신 노드를 항상 저장하십시오. 대기열을 최후의 첫 번째 대기열로 간주 할 수 있습니다. 새 노드가 들어가면 다음 논리가 채택됩니다.
newe.next = head; head = newe;
그런 다음 얻을 때 해당 논리를 사용하십시오
tmp = head; head = tmp.next; return tmp;
V. 참조#다음
즉, 처리하려는 참조 노드에 의해 저장된 다음 노드를 설명하십시오. 그러나 다음은 대기열에 배치 될 때만 의미가 있습니다. 해당 상태 값을 설명하기 위해 대기열에 배치 된 후 큐는 더 이상 대기열을 참조하지 않습니다. 대신, 그것은 특별한 quequeued를 나타냅니다. 대기열에 배치되었으므로 다시 대기열에 배치되지 않습니다.
6. 참조#참조
즉, 현재 참조에 의해 참조 된 실제 객체를 설명하며, 이는 주석에 명시된대로 신중하게 처리됩니다. 즉,이 물건이 재활용되고 재활용되면 NULL로 직접 설정되며 외부 프로그램은 참조 객체 자체 (참조 대신)에서 재활용 동작이 발생한다는 것을 배울 수 있습니다.
7. ReferenceQueue#enqueue 참조 eNqueue
이 프로세스는 활성-> 보류->에 대한 참조 객체의 프로세스입니다. 이 방법은 보류 상태를 qued 상태로 처리하는 객체를 처리하는 것입니다. 해당 프로세스는 이전 논리, 즉 노드가 수정되고 해당 코드는 다음과 같습니다.
r.queue = enqueued; r.next = (head == null)? r : head; head = r; queuelength ++; lock.notifyall ();
마지막 Nitify는 이전 대기열에서 차단하는 외부 프로그램에 알리는 것을 의미합니다. (즉, 보류중인 개체는 이전에 얻지 못했습니다)
8. 참조#tryhandlepending
즉, 참조 객체의 변경을 활성에서 보류 상태로 처리합니다. 참조 객체 내부에는 정적 필드가 있으며 해당 선언은 다음과 같습니다.
/* 참조 목록 대기 중 대기 중입니다. 컬렉터는이 목록에 * 참조를 추가하고 참조 핸들러 스레드는 *를 제거합니다. 이 목록은 위의 잠금 객체에 의해 보호됩니다. * 목록은 발견 된 필드를 사용하여 요소를 연결합니다. */개인 정적 참조 <bood> 보류 = null;
JVM은 GC 일 때 객체를이 정적 필드에서 처리 할 것임을 이해할 수 있습니다. 동시에, 발견 된 다른 필드는 처리 할 객체의 다음 객체를 나타냅니다. 즉, 처리 할 객체도 링크 된 목록이라는 것을 이해할 수 있습니다. 발견을 통해 대기합니다. 계속 보류 받기 만하면 Discovery를 통해 다음 객체를 지속적으로 얻을 수 있습니다. 두 스레드 모두이 보류중인 개체에 액세스 할 수 있으므로 잠금 처리를 사용해야합니다.
해당 처리 프로세스는 다음과 같습니다.
if (보류! = null) {r = 보류; // 'Instanceof'는 때때로 memoryError를 던질 수 있습니다. 때때로 // '보류중인'체인에서 'r'을 사용하지 않기 전에 이것을 할 수 있습니다 ... c = r Celderof Cleaner? (클리너) r : null; // '보류중인'체인에서 'r'을 풀지 못함 = r.discovered; r.discovered = null;} // 프로세싱 객체, 즉 Enqued State ReferenceQueue <? 슈퍼 객체> q = r.queue; if (q! = referencequeue.null) q.enqueue (r);9. 참조#Clear
get () 메소드를 통해 원래 객체에 더 이상 액세스 할 수 없도록 참조 객체에서 참조 된 원래 객체를 지우십시오. 해당 디자인 아이디어에서 큐 객체에 들어갔으므로 원래 객체에 다시 액세스 할 필요가 없기 때문에 해당 객체를 재활용해야 함을 의미합니다. 이 방법은 JVM에서 호출되지 않으며 JVM은 현장 운영을 통해 해당 참조를 직접 지우며 특정 구현은 현재 방법과 일치합니다.
명확한 의미는 참조를 무효화하는 것입니다.
약한 회의 객체가 큐에 들어간 후 해당 참조는 NULL입니다.
SoftReference 객체, 메모리가 충분한 경우 객체가 큐에 들어 가지 않으면 해당 참조가 NULL이되지 않습니다. 처리 해야하는 경우 (메모리 또는 기타 정책이 충분하지 않음) 해당 참조가 NULL로 설정된 다음 대기열을 입력합니다.
FinalReference 객체는 최종 개체를 호출해야하기 때문에 참조가 큐에 입력 되더라도 참조는 NULL이 아닙니다. 즉, 지우지 않을 것입니다.
Phantomreference 객체는 get 자체가 NULL을 반환하기 위해 구현되었으므로 그다지 유용하지 않습니다. Enqueue인지 여부에 관계없이 청소되지 않기 때문입니다.
10. 참조 핸들러 eNqueue 스레드
위에서 언급했듯이 JVM은 보류중인 객체로 처리 할 객체를 설정하므로 연속적인 Enqueue 작업을 수행 할 스레드가 있어야합니다. 이 스레드는 프로세서 스레드를 말하며 우선 순위는 Max_Priority, 즉 가장 높은 것입니다. 해당 시작 프로세스는 정적 초기화가 생성되며, 참조 객체 또는 클래스를 사용할 때이 스레드가 생성되고 시작됩니다. 해당 코드는 다음과 같습니다.
static {ThreadGroup tg = thread.currentThread (). getThreadGroup (); for (ordregroup tgn = tg; tgn! = null; tg = tg, tgn = tg.getParent ()); 스레드 핸들러 = 새로운 참조 핸들러 (TG, "참조 핸들러"); / * * max_priority보다 큰 특수 시스템 전용 우선 순위가 있으면 여기에서 사용됩니다 */ handler.setpriority (thread.max_priority); handler.setdaemon (true); handler.start ();}우선 순위는 최고이며, 참조 객체를 지속적으로 처리해야 할 필요성으로 이해 될 수 있습니다. Jstack을 통해 실행 스레드를 인쇄 할 때 해당 참조 핸들러는 다음과 같이 여기에 초기화 된 스레드를 나타냅니다.
11. JVM 관련
위의 처리 지점 각각에서, 이들은 JVM 재활용 프로세스와 관련이있다. 즉, GC 프로세스는 해당 참조와 함께 작동한다고 믿어집니다. 예를 들어, CMS 수집기를 사용하여 Preclean 프로세스는 위에서 언급 한 전체 프로세스 및 Softreference 비고 처리 등에 관여합니다. 동시에 참조 객체의 다양한 처리도 특정 유형과 관련되어야합니다. 해당 JVM 처리는 C ++ 코드를 사용하므로 신중하게 정렬해야합니다.
12. 요약
FinalReference 객체와 마찬가지로 전체 참조 및 참조 큐는 함께 작동하는 처리 그룹입니다. 다른 참조 의미를 보장하기 위해 JVM GC와 관련된 프로세스는 다른 시나리오와 다른 참조 수준에 대해 실현됩니다.
또한 큐를 모니터링하기 위해 참조 큐와 열기 스레드를 직접 사용하는 것은 너무 귀찮고 복잡하기 때문에. Google Guava에서 구현 한 FinalizableReferenceQueue 및 해당 FinalizableReference 객체를 참조 할 수 있습니다. 처리 프로세스를 약간 단순화 할 수 있습니다. 위의 내용은이 기사의 전체 내용이며, 모든 사람의 학습이나 업무에 도움이되기를 바랍니다.