4월, 2018의 게시물 표시

Useful GO coding pattern

프로그래밍 언어 GO 작성 시 유용한 패턴에 대해 공유한다. 1. Broadcasting with observer pattern c.incomingMsgChan 으로 모든 채널의 메세지가 들어올 때, range와 case를 사용하여 선택적으로 listening함으로써 간단하게 observer pattern을 구현할 수 있다. for msg := range c . incomingMsgChan {     select {     case c . memoryMsgChan <- msg :     default:     } } 2. Cleanup with signal Graceful shutdown을 위한 flow control 구현 시 GO의 channel을 이용하면 간단하게 구현할 수 있다. func work() {     exitChan := make( chan int )     go task1(exitChan)     go task2(exitChan)     time . Sleep(5 * time . Second)     close(exitChan) } func task1(exitChan chan int ) {     <- exitChan     log . Printf("task1 exiting") } func task2(exitChan chan int ) {     <- exitChan     log . Printf("task2 exiting") } 3. Superloop considering cleanup 2.를 실제 시스템에 적용할 때 Superlo...

JVM Thread & Memory Monitoring

이미지
JVM 위에서 실행되는 프로세스의 메모리 사용량 Monitoring 에 대해 정리한다. 우선 사용되는 툴에 대한 간략한 정리 JPS - Java Process Status, JVM에서 실행되고있는 프로세스의 목록을 확인할 수 있다. JMAP - JVM에서 실행되고있는 프로세스의 메모리 사용량을 확인할 수 있다. 0. Monitoring 할 프로세스 ID 확인 jps 실행 후 이름을 보고 프로세스 ID를 확인한다. -l 옵션을 사용하면 패키지명까지 볼 수 있다. 이외에도 옵션이 있다. 1. 객체 별 메모리 사용량 확인 jmap -histo [processID] 목록이 길 경우 파이프를 이용하면 유용하다. ex) jmap -histo 999 | head       jmap -histo 999 | tail       jmap -histo 999 | grep 'mypackage'       jmap -histo 999 | grep 'mypackage' | head 2. Heap 사용량 확인 jmap -heap [processID] Max, used, free 등을 space 별로 확인할 수 있다 [2]. * 주의점 JMAP -heap 을 사용할 경우, 프로세스를 실행시킨 사용자와 같은 사용자가 아니면 프로세스에 attach 할 수 없다. 3. Thread dump jstack [processId] jstack을 실행하는 시점의 thread stack trace가 가능하다. 파일로 저장하여 확인하고자 한다면,  shifter를 사용하면 간단하다. jstack [processId] >> thread.dump Reference [1] Spring Boot Memory Performance, https://spring.io/blog/2015/12/10/spring-boot-m...