스레드에는 누구나 자주 호출하는 메소드가 있는데, 바로 ThreadLocal입니다. 그러나 ThreadLocal은 메모리 처리에서 더 어려운 문제에 직면하게 되며 일부 메모리 누수는 항상 발생합니다. 이 기사에서는 누출 사례를 사용하여 모든 사람을 분석하고 누출의 일부 상황을 이해하는 데 도움을 주며 ThreadLocal에 해당하는 솔루션을 제안합니다.
1. 누출 사례
ThreadLocalMap의 정적 내부 클래스 항목:
정적 클래스 항목은 WeakReference<ThreadLocal<?>>을 확장합니다. /** 이 ThreadLocal과 관련된 값 */ 개체값; Entry(ThreadLocal<?> k, 객체 v) { 슈퍼(k); 값 = v; } }
ThreadLocalMap은 정적 내부 클래스 Entry를 사용하여 <k, v> 저장소를 구현하고 Entry는 WeakReference 클래스를 상속하므로 ThreadLocalMap의 키는 실제로 ThreadLocal에 대한 약한 참조입니다.
정확히 말하면 ThreadLocalMap은 ThreadLocal의 약한 참조를 키로 사용하기 때문에 이 ThreadLocal에 외부의 강력한 참조가 없으면 GC가 됩니다. 이때 ThreadLocalMap에는 null 키가 포함된 Entry가 표시됩니다. 물론 이 Entry의 값에는 액세스할 수 없습니다.
이 경우 현재 작업 스레드가 종료되지 않은 경우 null 키가 있는 값은 Entry에 의해 강력하게 참조되고 Entry는 현재 스레드의 ThreadLocalMap에 의해 강력하게 참조되므로 이 값은 절대 GC되지 않으므로 메모리 오류가 발생합니다. 새다.
2. 솔루션
ThreadLocalMap의 cleanSomeSlots() 및 expungeStaleEntry() 메소드는 널 키를 사용하여 값을 지울 수 있습니다. ThreadLocal의 set(), get(), Remove() 메소드에서는 cleanSomeSlots() 또는 expungeStaleEntry()를 호출하여 ThreadLocalMap에서 null 키가 있는 모든 값을 지웁니다.
위의 내용은 Java ThreadLocal 메모리 누수에 대한 해결 방법입니다. 물론 이는 메모리 누수에서 특정 역할만 수행할 수 있습니다. 이는 일종의 명확성일 뿐이며 발생하지 않는다는 보장은 없습니다 .