주의 - finalize 메소드는 JAVA 9부터 Deprecated되었으며 사용하는 것을 지양하자
try-finally, try-with-resources를 이용하여 처리해주자
글 다시 작성했습니다. 아래 글 참고해주세요
https://potwings.tistory.com/63
X바(자바) finalize 메소드 쓰지마세요
Java9부터는 Deprecate 되었어요 쓰지 마세요. 과거 필자는 특정 객체 동작하면서 남긴 임시 파일을 해당 객체가 소멸될 때 제거되도록 하기 위해finalize 메소드를 사용하여 처리하려 했던 적이 있었
potwings.tistory.com
finalize 메소드는 자바에서 객체가 더 이상 참조되지 않을 때 Garbage Collector가 불필요한 메모리를 회수하면서 실행하는 메소드이다.
finalize 메소드를 사용하지 않는 이유
1. finalize 메소드는 언제 실행될지 모른다 심지어 실행이 될 거라는 보장도 할 수 없다. 2. finalize 메소드 내부에서 발생한 exception 처리할 수 없다.
3. finalizer 공격이 가능해진다. (추후 정리 예정)
finalize 메소드는 GC가 발생할 때 실행되는 메소드일 뿐 GC의 과정이 아니다
stop-the-world는 finalize메소드가 동작할 때 발생하는 것이 아닌 GC가 동작할 때 발생한다.
삽질( 잘못된 내용)
stop-the-world에 대한 테스트
이를 확인하던 중 실제로 stop-the-world가 어떻게 작동하는지가 궁금하여 테스트해보고자 하였다.
Thread.sleep을 활용한 테스트
finalize 메소드에 thread.sleep을 활용하여 의도적으로 지연을 걸어준 뒤 stop-the-world가 발생하는지를 확인하려했다.
![](https://blog.kakaocdn.net/dn/0SiBa/btsfe8DjFzC/52fkPpp36cf8lf6b0vKlBK/img.png)
![](https://blog.kakaocdn.net/dn/6AQBU/btsfPCQdYrp/gmiQK4rAOKQ96MpZ5q1BTk/img.png)
하지만 객체가 계속적으로 생성되어도 stop-the-world는 발생하지않고 실행되었다.
심지어 finalize했다는 로깅은 잘 보이도 않는다.
![](https://blog.kakaocdn.net/dn/bCByfz/btsftJWTJJt/Puv0YXAn0OVkLKihtaDaIK/img.png)
Main메소드에 Break Point를 추가하여 디버깅을 진행해보니 이제야 finalize했다는 로깅이 어느정도 보인다.
![](https://blog.kakaocdn.net/dn/cRf0v8/btsfezVs8l6/zX6rBUb2k4p624zghLG9s0/img.png)
Thread.sleep은 Thread를 TIMED_WAITING 상태로 만드는 것이기 때문에 더 정확한 테스트를 위하여 finalize 메소드에 작업을 추가하여 테스트해 보았다.
![](https://blog.kakaocdn.net/dn/6AQBU/btsfPCQdYrp/gmiQK4rAOKQ96MpZ5q1BTk/img.png)
![](https://blog.kakaocdn.net/dn/drbxH8/btsf0WvskFw/xZaPOaZ7VyvWDszkigL4zk/img.png)
마찬가지로 finalize가 진행되는 중에 main 메소드가 실행되고 있다.
![](https://blog.kakaocdn.net/dn/dvZHle/btsf58nClae/P46IMeopLjux0ZV6JCLJf0/img.png)
검색해보니 finalized 메소드는 스레드의 우선순위가 낮아서 정상적으로 실행되지 못하는 경우가 있다고 한다.
Break Point를 추가하여 Main 메소드가 잠시 중단되어 실행될 기회를 찾아서 finalize가 된 것이다.
이를 통하여 finalize가 실행을 보장할 수 없다는 점도 직접 볼 수 있었다.
결론 - finalizer를 사용하는 대신 try-finally, try-with-resources를 통하여 처리해주자.
'BackEnd > Java' 카테고리의 다른 글
DTO 그렇게 쓰는 거 아닌데 ㅋㅋ (0) | 2024.03.17 |
---|---|
Java HashMap이 List보다 contains의 성능이 더 좋은 이유 (2) | 2023.11.26 |
JAVA 객체 배열, 리스트 값 비교(Comparable, Comparator)를 통한 정렬 (0) | 2023.09.03 |
JAVA에 Call by refernce는 없다. (0) | 2023.07.03 |
JAVA equals, hashCode 메소드 (0) | 2023.05.18 |