작성한 프로그램이 정상적으로 수행이 되고 메모리 낭비는 없는지? 생성한 Thread가 잘 동작하다가 문제없이 삭제되는지 등 여러가지 JAVA에서 생성된 스펙을 확인하고자 할때, JConsole을 통해 좀 더 유용하게 확인 할 수 있습니다.
Netty Client를 통해 여러 곳에 메시지를 처리해야 하는 상황이였는데, 이부분을 생성자를 통해 각각 필요할때마다 불러와서 new 생성자를 통해 처리하였습니다.
Netty에는 EventLoop가 Thread로 동작하게 되어 있는데, 생성된 이 group들을 별도로 종료하지 않으면 was가 종료되기 전까지 계속 살아있게되고 이상태로 서비스가 운영된다면 추후에는 Memory Leak과 같은 현상이 발생하면서 was가 죽어버리는 끔찍한 일이 발생할 수 있습니다.
JConsole
1. JConsole 실행하기
- 설치한 자바 위치의 bin디렉토리에 JConsole이 있습니다.
- 환경변수를 잡았다면 cmd창에 JConsole을 입력합니다.
실행해줍니다.
2. JConsole 확인할 Java 프로세스 선택하기
여기서 확인하고 싶은 클릭하고 프로세스를 연결합니다.
3. 경고창 확인
경고창이 뜨면 Insecure connection을 누릅니다.
4. 원하는 탭에서 사용
메모리에서 현재 사용하는 메모리 사용량
Threads에서 동작중인 Thread리스트 등등 각각 원하는 탭에서 상태를 확인하시면 됩니다.
5. 저는 Thread가 정상적으로 동작하고 종료되는 모습을 확인하기 위해 Threads탭을 클릭합니다.
Thread개수와 사용중인 Thread리스트가 나오고 Thread를 클릭하면 상세정보가 나옵니다.
해당 소스에서는 shutdownGracefully(); 처리가 없는 상태로 nioEventLoopGroup이 사용할때마다 추가되고 있는 모습을 볼 수 있습니다.
6. shutdownGracefully();를 통해 Thread 종료 처리 후 확인하기
특정 행위가 만족되면서 new NettyClient에 의해 EventLoop가 생성으로 Threads에 항목이 추가되고, 추후 종료동작에서 Shutdown으로 인해 EventLoop에서 사라지는걸 볼 수 있습니다.
TCP 통신 해야하는 경우 JAVA SOCKET을 통해 서버를 구성하거나 클라이언트 소스를 구성하여 연결을 하고 메시지를 주고 받고 종료하고 데이터를 가공하거나 처리하거나 등등 여러가지를 할 수 있는데, 이를 좀 더 기능적으로 사용하기 쉽게 도와주는 네트워크 프레임워크로 Netty가 있습니다.
이번에 프로젝트를 하나 진행하면서 여러가지 요구사항을 보다 쉽게 수행하고 추후에 능률적으로 유지보수하기 위해 Netty 프레임워크를 통해 진행해본 과정을 튜토리얼 식으로 남겨볼까 합니다.
Spring 프로젝트에 서버와 클라이언트를 구성하여 필요한 경우 연동처리를 진행하였는데, 이번에는 Maven프로젝트에서 구성하도록 하겠습니다.
스프링 프로젝트에서 Netty 프레임워크를 사용하여 'ServerBootstrap'을 구동하고 사용하였는데, 톰캣을 종료하면 자연스럽게 죽을줄 알았던 Netty 서버가 좀비처럼 계속 살아있는 현상이 발생했다.
덕분에 톰캣을 재기동하게 되면 같은 포트로 바인딩하면서 BindException이 발생하는 등 여러가지 문제가 생겼고, 대처법으로 netstat을 통해 port의 pid를 찾아와 kill을 시킬까 했지만, 애초에 종료를 안하는 원초적인 문제를 해결하는것이 맞다고 판단하여 아래와 같이 '@PreDestroy' 어노테이션을 추가하여, 스프링을 종료하게되면 ServerBootstrp을 종료 할 수 있도록 구성하였다.