본문 바로가기

전체 글

(40)
[Java] Thread Dump Thread Dump란? 문제상황1. 데드락 문제상황2. 처리 지연 Thread Dump란? 실행 중인 서버의 thread 상태의 snapshot을 획득하는 행위를 말합니다. 앞선 글 동시성 처리 - intro에서 살펴보았듯이 멀티스레드 환경에서 발생하는 여러 이슈들이 있습니다. 각 스레드가 어떤 상태에 놓여 있는지 thread dump를 활용하여 분석하면 어디서 문제가 발생하였는지 측정하여 이를 해결할 수 있습니다. 이번 글에서는 VisualVM을 활용해 특정 문제 상황들을 재현한 뒤 thread의 상태를 분석해보도록 하겠습니다. NaverD2 - 스레드 덤프 분석하기를 보면 jstack, JMC 등을 이용해 thread dump를 뜨면 로그 형태의 text로 각 thread의 정보를 확인할 수 있는데..
Timeout이란? - Connection Timeout / Read Timeout 타임아웃이란? timeout은 특정 이벤트를 완료하는 데 할당된 제한 시간입니다. 이 제한 시간 안에 특정 이벤트가 완료되지 않으면 보통 'timed out' 되었다고 말합니다. 즉, timeout은 '제한시간' 그 자체를 나타내고, timed out은 제한 시간 내에 완료되지 못한 상태에 가깝습니다. 따라서 개발을 할 때 보통 timeout을 세팅하고, 그 시간 내에 처리되지 못하면(timed out) 어떤 조치를 취할 것인가를 구현하는 것이 일반적입니다. 이 때, 위에서 말한 특정 이벤트란 다음과 같이 network layer, application layer 두가지 계층으로 나누어 볼 수 있습니다. Network layer 서버 간 TCP/IP 통신은 먼저 connection을 수립하고 이루어집니다..
[Java] 테스팅 툴 - JMeter 앞선 글(모니터링 툴 - VisualVM)에서 JVM 기반의 서버 자원에 대한 모니터링 방법을 알아보았습니다. 이 때 클라이언트의 요청을 전달하기 위해 IDE(IntelliJ)에서 직접 수동으로 http 요청을 보내 서버가 request를 처리하도록 만들었습니다. 만약 동시에 얼마나 많은 요청을 처리할 수 있는지를 알아보기 위해서는 어떻게 요청을 보내야 할까요. http 요청을 여러번 수동으로 클릭하거나, 테스트 코드를 만들어 해당 요청을 여러 번 보낼 수 있도록 코드를 작성해야 할까요. 이러한 테스트를 자동화하기 위한 툴들이 있습니다. 이번 글에서는 Apache에서 오픈소스로 만든 'JMeter'의 활용에 대해서 살펴보도록 하겠습니다. JMeter JMeter는 application의 성능(perfor..
[Java] 모니터링 툴 - VisualVM JVM 기반의 서비스를 운영하면서 만약 OOME(OutOfMemoryError) 같은 메모리 관련 이슈가 발생하면 어떻게 문제를 분석해야 할까요? 어떤 객체가 메모리를 많이 잡아먹고 있는지 코드를 하나하나 분석하며 추측해볼 수도 있겠지만, 수만에서 수백만, 수억 라인이 되는 대규모 서비스의 코드를 일일이 분석하기란 불가능에 가까울 것입니다. 그렇기에 서비스를 운영할 때는 문제를 더 쉽고 빠르게 파악할 수 있도록 모니터링 툴을 활용하고 있습니다. 위와 같은 메모리 관련 이슈가 발생했다면 JVM의 메모리가 어떻게 관리되고 있는지 확인하고 싶을 것입니다. 다양한 상용 툴이 있지만 Oracle에서 지원하는 오픈소스 기반의 VisualVM을 활용해 설명해보도록 하겠습니다. VisualVM 모니터링을 위한 Cont..
[Java] 동시성 처리 - Lock Algorithms(락 알고리즘) 이전 글 [Java] 동시성 처리 - intro 앞선 글에서 자바의 동시성을 이야기하며, 자바에서의 Lock 사용법을 위주로 설명하였습니다. 자바 내장 모듈이 기본적으로 지원하는 API를 활용해서 동시성을 처리한다면, 까다로운 구현 없이 처리할 수 있을 것입니다. 하지만 각 API가 어떻게 성능을 개선해왔는지를 이해하기 위해서는 그 작동방식에 대해서 이해해야 할 필요가 있습니다. 이를 위해 이번 글에서는 일반적인 lock algorithm에 대해서 살펴보고자 합니다. 그 전에 blocking과 non-blocking에 대해서 먼저 살펴보고자 합니다. 각 알고리즘들은 상황에 따라 blocking과 non-blocking 개념을 적절히 활용하여 구현되고 있기 때문입니다. Blocking - Non-Block..
[Java] Garbage Collection(GC) 변천사 GC(Garbage Collection)란? 자바에서는 C계열의 언어와 달리 메모리 관리를 개발자가 직접 하지 않습니다. Garbage Collector가 사용되지 않는 메모리에 대한 참조를 자동으로 해제하여 메모리 공간을 확보합니다. 자바에서는 버전 업그레이드를 하면서 GC 알고리즘도 같이 향상시켜왔습니다. 처리 성능을 높이고, 애플리케이션이 중단되는 시간을 최대한 줄이기 위해서입니다. GC의 대상이 되는 메모리 영역은 JVM의 메모리 구조에서 heap 영역인데, 자바가 처음 출시되었을 때 사용하던 mark-and-sweep 알고리즘 이후부터는 generational 개념과 동시성(concurrent) 기반으로 작동하고 있습니다. generational 기반 GC의 자세한 내용은 NaverD2 - Ja..
[Java] Java Virtual Machine(JVM) 출처 : https://d2.naver.com/helloworld/1230 이 글은 위 NaverD2 게시물을 요약, 정리한 글입니다. 가상머신 가상머신(virtual machine)은 프로그램을 실행하기 위해 물리적 머신(컴퓨터 등)과 유사한 머신을 소프트웨어로 구현한 것 자바는 원래 WORA(Write Once Run Anywhere)를 구현하기 위해 물리적인 머신과 별개의 가상 머신을 기반으로 동작하도록 설계됨 이를 통해 자바 바이트코드를 실행하고자 하는 모든 하드웨어에 JVM을 동작시킴으로써 자바 실행 코드를 변경하지 않고 모든 종류의 하드웨어에서 동작하게 된 것 JVM의 특징 스택 기반의 가상 머신: 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 J..
[Java] 동시성 처리 - intro 동시성이 필요한 이유 동시성 이슈 동시성 이슈를 해결하는 방법 자바에서의 동시성 이슈 해결 마치며 한동안 동시성은 제가 고려해야 할 사항이라고 생각하지 않았습니다. 우선은 동시성 처리라는 개념이 너무 어려웠고, 기능을 '구현'하는 데 있어서 동시성 처리가 필요할 정도의 성능을 요구하는 로직을 작성할 필요와 경험이 없었기 때문이기도 합니다. 한가지 변명을 하자면 동시성 처리 성능을 개선하기에 앞서 정확히 '동작'하는 기능을 구현하는 것이 더 중요하다고 생각하기도 했고, Clean Code 스터디를 하면서 동시성이 항상 성능을 높여주지는 않는다는 미신과 오해를 그 근거로 들기도 했습니다. 동시성에 대해 정확히 이해하지 못하고 사용할 바에야 동시성의 이점을 포기하고 정확하게 동작하는 기능 구현을 선택하겠다는 ..