블로그를 처음 시작하면서 어떤 글을 쓸까 고민을 많이 하다가 오늘 있었던 일로 시작을 하려고 합니다.
개발을 하던 도중에 톰캣 로그에 아래와 같은 에러가 찍혔습니다.
java.lang.OutOfMemoryError: Java heap space
검색을 해보니 java의 heap memory 사용률은 jconsole로 확인이 가능하다고 하여 사용법을 알아보았습니다.
1.
우선 현재 서버, 개인 PC에서 동작중인 java 프로세스의 pid가 필요합니다.
Windows는 tasklist | findstr {java 프로세스명} 으로 해당 java 프로세스의 pid를 확인 할 수 있습니다.
ex) tasklist | findstr java, tasklist | findstr Tomcat
2.
jconsole -help를 cmd창에서 입력하면
Usage: jconsole [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]
-interval Set the update interval to n seconds (default is 4 seconds)
-notile Do not tile windows initially (for two or more connections)
-pluginpath Specify the path that jconsole uses to look up the plugins
-version Print program version
connection = pid || host:port || JMX URL (service:jmx:<protocol>://...)
pid The process id of a target process
host A remote host name or IP address port The port number for the remote connection
-J Specify the input arguments to the Java virtual machine on which jconsole is running
위와같은 내용이 Jconsole : Output 팝업에 나타납니다.
저희는 로컬 java 프로세스의 heap space 이용률을 pid를 이용해 알아보려고 하기 때문에 다른 옵션들은 필요없습니다.
cmd 창에서 tasklist 명령어를 통해 알아낸 pid를 다음과 같이 이용하면 됩니다.
jconsole {java 프로세스 pid}
3.
jconsole 명령어를 사용하면 위와 같은 팝업이 뜨면서 해당 java 프로세스의 정보를 알 수 있습니다.
다시 처음으로 돌아가서 제 경우에 java heap space OOM이 발생했던 이유는 제가 멀티스레드 프로그램을 톰캣에 올려두었는데 서로 다른일을 하는 여러개의 thread pool이 동시에 시작할때 default max size를 초과하여 나타났습니다.
이에 대한 조치로는 tomcat 옵션에 Xmx를 추가하여 해결하였습니다.
'개발 > Java' 카테고리의 다른 글
Import vs Import static (0) | 2021.06.17 |
---|---|
Shallow copy와 Deep copy (0) | 2021.03.25 |
암호화란? (ECB 샘플 코드) (0) | 2021.03.16 |
Java 배열 정렬 (0) | 2021.02.22 |
Scanner vs BufferedReader 비교 (0) | 2021.02.10 |