아이템 8번은 객체의 소멸에 대한 이야기
둘다 사용하지 마라 원하는 시점에 객체가 제거된다고 보장할 수 없다.
소켓이나 파일 읽어올 때 읽어올 수 있는 수의 제한이 있다
이걸 무한정 읽어오게되면 너무 많은 객체를 불러오게되어 에러가 난다.
이런 에러의 근본적 원인이 사용한 자원 반납이 제대로 처리되지 않아서
디비 커넥션, 네트워크 커넥션 리소스 정리가 안되면 문제가 생긴다.
적절한 타이밍에 정리가 안되는게 finalizer, cleaner 언제 실행될지 모른다.
finalizer() 내에서 리소스 정리하는 로직이 들어간다면 예외가 발생하면 처리할 작업이 남아있어도 자원이 반납이 안된채로 어플리케이션이 종료된다.
package item8.finalizer;
public class FinalizerIsBad {
// Object 클래스에 정의된 메서드 자바 9버전부터 Deprecated
// 해당 클래스가 가비지컬렉션 대상이 되면 회수하기 직전 메서드가 실행되어
// 리소스를 해제하거나 다른 정리작업을 수행할 수 있게 만든 메서드
// JVM에 강하거나 약한 참조가 되지 않을 때 수집대상이 된다.
@Override
protected void finalize() throws Throwable {
System.out.print("");
}
}
package item8.finalizer;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.Field;
public class App {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
int i = 0;
while(true) {
i++;
// FinalizerIsBad 객체가 가비지컬렉션 대상이 되면 finalize() 메서드가 실행된다.
// 가비지 컬렉션 되면서 해당 객체는 레퍼런스 큐에 담긴다.
new FinalizerIsBad();
// 백만번째 실행할 때 마다 Finalizer 큐에 얼마나 많은 객체들이 쌓여있는지 확인하는 코드
if((i % 1_000_000) == 0) {
Class<?> finalizerClass = Class.forName("java.lang.ref.Finalizer");
Field queueStaticField = finalizerClass.getDeclaredField("queue");
queueStaticField.setAccessible(true);
ReferenceQueue<Object> referenceQueue = (ReferenceQueue) queueStaticField.get(null);
Field queueLengthField = ReferenceQueue.class.getDeclaredField("queueLength");
queueLengthField.setAccessible(true);
long queueLength = (long) queueLengthField.get(referenceQueue);
System.out.format("There are %d references in the queue%n", queueLength);
}
}// end of loop
}// end of main
}// end of class
큐에서 제때 삭제가 안되고 있다. 객체 생성하는데 바빠서 제대로 처리가 안되고 있는 것. 스레드 우선순위에서 뒤로 밀린 것이라고 볼 수 있다.
https://www.itworld.co.kr/howto/224419
https://recordsoflife.tistory.com/656
cleaner 내부적으로 팬텀 레퍼런스 사용
https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-2/dashboard
'개인룸 > 도윤' 카테고리의 다른 글
Item11. equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2023.01.31 |
---|---|
item10. equals는 일반 규약을 지켜 재정의하라. (0) | 2023.01.29 |
아이템 7 다 쓴 객체 참조를 해제하라 (1) | 2023.01.15 |
아이템6 불필요한 객체 생성을 피하라 (0) | 2023.01.08 |
아이템5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2023.01.08 |