티스토리 뷰

C++ 을 쓰다가 자바를 쓰려고 하면 꼭 걸리는게 있다.

자바는 생성자는 있지만 소멸자가 없다.

곧 할당된 인스턴스가 힙에서 언제 사라질지 아무도 알지 못한다.

가베지 콜렉터가 언제 돌아간다는 보장도 없다.

모든 게 동적 생성이고, 레퍼런스 카운트로 가베지 콜렉팅을 처리하고...

그 콜렉팅하는 시기도 알 수 없기에 이런 현상이 나타난다.


이에 관련해서 쉽게 접할 수 있는 오류는 JDBC 에서 세션을 열고 닫지 않을때이다.

명백히 close 를 하지 않으면, 물리적인 DB 세션이 살아 있다.

이렇게 계속 진행해보면, netstat 으로 established 상태로 1521 포트로 접속된 소켓의 개수가 점점 늘어남을 확인할 수 있다.

이런 경우 finally 에서 null 인가 확인하고 close 를 해줘야 한다.

이 작업은 필수적이지만, C++ 에서는 동적 생성을 안해도 되고...

간단히(?) 소멸자에서 이런 처리를 할 수 있다.

혹자는 말한다, JDBC 쓰지말고 프레임 워크를 쓰라고...

물론 쓰면 편리하지만, 쓰면서 이런 오류가 있을 수 있음을 간과할 수 있으니 명심하자.

자바는 소멸자가 없고, 그래서 명시적으로 해제 작업을 해야 한다.

댓글