회사에서 업무 중 OOM이 발생하며 트러블 슈팅을 하면서 배웠던 내용들을 공유드릴려고 합니다. OOM이란? out of memory의 앞글자에서 따온 말로 heap 영역에 인스턴스나 더미 데이터들이 정해놓은 heap 크기보다 커졌을 때 보통 발생합니다. 또는 스레드 스택 메모리나 메타 스페이스 등에 데이터가 꽉차더라도 문제가 발생할 수 있습니다. 더 이상 인스턴스에게 새로운 메모리 공간을 할당할 수 없기 때문에 서버는 에러를 내고 서버를 죽입니다. 다음은 OOM이 발생하는 코드를 만들어봤습니다. 이 코드에선 계속해서 ArrayList에 데이터를 append하여 추가하다가 어느 순간 메모리 공간이 부족해지면 에러가 발생하여 프로그램이 동작을 멈출 것입니다. fun main() { val list = mut..
jenkins로 CI를 하던 와중 jenkins 서버 내 용량이 이상하리 만큼 많이 쌓여서 원인을 분석하면서 storage driver에 대해 알게 됐습니다. storage driver를 잘 알고 있지 못하면 생기는 문제 그리고 storage driver 종류에 따라 생기는 문제를 알아보겠습니다. Storage Driver란? docker storage driver는 docker image로 부터 container를 생성하는데 이 때 docker image는 application code, system, library등을 포함합니다. 그리고 이를 저장하고 관리하기 위해선 store system이 필요한데 이것을 storage driver 이라고 합니다. 또한, storage driver는 image가 여..
코드를 살펴보면서 좋아요 기능에 멀티 스레드로인한 동시성이나 성능을 개선할 수 있는 방법이 떠올라 개선해보았습니다. 제가 계속해서 개선해나간 기록들을 남겨두며 누군가에게 도움이 됐음 좋겠습니다. 문제 상황 @Transactional public Long likeBoard(final Long boardId, final Long memberId) { Board board = boardReadService.getBoardOne(boardId); board.getBoardCount().plusLike(); return likeRepository.save(Like.createLike(memberId, boardId)).getId(); } 여러 스레드가 Board 객체를 조회하고 plusLike를 한 후 마지막으로..
GC는 안쓰는 인스턴스를 처리하기 전에 반드시 stop the world를 하고 이 순간 모든 애플리케이션 동작이 멈추고 GC는 빠르게 불필요한 인스턴스 메모리를 제거합니다. 실제로 회사에서 인터셉터에서 계속 호출되는 똑같은 형태의 객체가 존재하여 플라이웨이트 패턴을 이용하여 자주 참조되는 인스턴스를 static으로 선언하여 GC 동작이 자주 되는 코드를 개선한 경험이 있었는데요. GC가 자주 호출 되면 그 만큼 stop the world가 자주 발생하여 사용자 입장에서 느껴질 정도로 애플리케이션 동작이 지연될 수 있다고 한 글을 읽어 이러한 개선을 했던 것입니다. (메모리 측면도 물론 고려하여) 그렇다면 stop the world가 길어질 수록 성능이 떨어지기 때문에 GC 튜닝의 최종 숙제는 결국 st..
Lombok이란? Lombok은 자바에서 제공해주는 라이브러리로 반복적인 코드인 Getter Setter 생성자등을 어노테이션을 기반으로 생성해주며 코드 가독성을 향상시켜줍니다. (물론 어노테이션이 떡칠된 Entity를 보면 적당히 쓰는것도 필요해보입니다.) 어떻게? Lombok은 컴파일 시점에 Annotation Processor를 사용하여 @Getter와 @Setter 같은 어노테이션이 붙은 소스를 읽어들이고 이를 기반으로 새로운 코드를 생성합니다. 순서를 보기 전 미리 알아둬야할 키워드가 있습니다. 추상 구문 트리 컴파일러는 소스 코드를 분석하고 문법에 맞지 않는 부분을 찾아내고 이를 수정하거나 오류를 보고하는데 이 과정에서 소스 코드를구문 분석할 때 생성되는게 추상 구문 트리입니다. 추상 구문 트..
배경 https://golf-dev.tistory.com/53 Redis INCR을 이용한 분산환경에서의 동시성 제어하기 문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save( golf-dev.tistory.com 제 블로그를 많이 읽어보셨다면 익숙한 글 입니다. Redis INCR 동작원리를 이용해서 분산환경에서 Lock을 구현했었는데요. 이 방식이 과연 최선이었는가에 대해서 고민을 해보는 시간을 가져볼 겁니다. 뭐가 문젠데? 요청 프로세스를 다이어그램으로 그려보면 다음과 같습니다. 이미 요청 횟수를 정해놓고 구현했기 때문에 INCR로 두 서버에서 요청수를 co..
대표적으로 필자가 사용하는 언어인 Java와 Kotlin은 compile 방식으로 해석되고 있습니다. 그리고 compiler로 해석된 자바 바이트 코드는 JVM의 interpreter로 기계어로 번역되어 실행되고 있습니다. 그리고 OS 코드영역에 올라가 OS에서 기계어를 읽어 적절한 동작을 합니다. 그렇다면 Java나 Kotlin은 컴파일 방식을 택했고 JVM은 왜 interpreter 방식을 택했을까요? 이 둘의 차이점은 무엇일까요? ⚙️ Compiler compiler는 소스코드를 기계어로 해석합니다. 과정은 다음과 같습니다. 소스 코드 읽기 : 컴파일러는 소스 코드 파일을 읽어들입니다. 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해합니다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을..
스프링 MVC 구조는 tomcat 엔진에 thread pool을 사용하고 webflux 구조는 netty 엔진의 이벤트 루프를 통해 스레드를 미리 만들어놓은 환경에서 작업을 처리합니다. 이렇게 미리 만들어놓고 쓰는 이유는 스레드를 생성될 때마다 비용이 비싸기 때문에 미리 만들어 놔야 한다고 알고 있을겁니다. 이번 포스팅에서는 그 이유에 대해 알아보도록 하겠습니다. One-To-One multi-threading model 먼저 JVM에서의 다중 Thread 모델은 one to one 모델을 따르고 있습니다. 그렇다면 이 모델은 도데체 무엇이고 thread pool 등장 배경과 무슨 관계 일까요? one to one 모델은 사용자 수준의 thread와 커널 스레드가 1대 1로 연결되어있는 형태를 말합니다...
Java에서 Thread-safe 한 Map 자료구조를 생각하면 떠오르는 3가지에 대해서 알아보겠습니다. HashTable HashTable은 HashMap 이전에 사용하던 자료구조입니다. HashTable은 Thread-safe하게 동작하기 위해 내부가 다음과 같이 구현되어있습니다. put 메서드 구현부입니다. 메소드에 synchronized가 붙어있어 스레드가 HashTable에 put을 할 때에는 다른 스레드가 접근하지 못해 Thread-safe하게 동작합니다. 또한 다른 메서드들도 synchronized가 붙어 Thread-safe합니다. 하지만 이러한 구조는 문제점을 안고 있습니다. 메서드에 synchronized가 걸려있으면 class 전체에 Lock이 걸리기 때문에 HashTable의 기능 ..
GC를 알아보기 전 stop-the-world 라는 용어를 살펴보자, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. 어떤 GC 알고리즘을 사용하더라도 발생 되며 GC작업이 완료된 이후에 다시 중단했던 작업을 시작한다. 대게 GC 튜닝은 이 stop-the-world 시간을 줄이는 것이다. Java 프로그램 코드에서 메모리를 명시적으로 지정하여 해제하지 않는다. 그렇기에 이 작업을 GC가 더이상 필요없는 객체를 찾아 지우는 작업을 한다. 가비지 컬렉션은 두 가지 가설하에 만들어 진 알고리즘이다. 대부분 객체는 금방 접근 불가능 상태가 된다. 오래된 객체에서 젊은 객체로의 참조는 아..
- Total
- Today
- Yesterday
- 취준
- CS
- Kotlin
- Redis
- 면접
- 개발자
- DevOps
- 프로젝트
- docker
- java
- 코딩
- 면접준비
- DB
- swarm
- 게시판
- 백엔드
- 면접 준비
- JPA
- 동시성
- 자바
- Spring
- 취업준비
- 개발
- MySQL
- 코드
- 취업
- 인터뷰
- thread
- IT
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |