일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- linux
- Gradle
- db
- Spring Boot
- laravel
- jenkins
- ReactJS
- Web Server
- AWS
- 요리
- JVM
- Oracle
- 맛집
- it
- springboot
- Git
- elasticsearch
- devops
- ubuntu
- tool
- Design Patterns
- Spring Batch
- javascript
- php
- IntelliJ
- redis
- Spring
- jsp
- java
- MySQL
- Today
- Total
목록Java & Kotlin/Java (110)
아무거나
Java 21 Virtual Thread해당 글은 kakao tech meet 발표 을 참고하여 필요한 부분만 요약하여 정리하였다. Virtual ThreadJDK 21(LTS) 에 추가된 경량 스레드 OS 스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통하여 수십 ~ 수백만개의 스레드를 동시에 사용할 수 있게 한다. 해결하고자 하는 문제애플리케이션의 높은 처리량(throughput) 확보Blocking 발생시 내부 스케줄링을 통해 다른 작업을 처리자바 플랫폼 디자인과 조화를 이루는 코드 생성기존 스레드 구조 그대로 사용sealed abstract class BaseVirtualThread extends Thread permits VirtualThread, ThreadBuilders.Bound..
원인원인은 Redis 의 Packet Loss 가 발생하였고 해당 애플리케이션의 전체 Pod 에서 OOM 이 발생하면서 재시작되는 현상이였고 Pod 의 Heap 메모리 사용량은 여유가 있는 상태였습니다.왜 이러한 문제가 발생하였는지 알아보겠습니다. 컨테이너에서 OOM 발생먼저 서버로그를 확인해본 결과 Gzip 압축 적용후에 점진적으로 메모리 사용량이 증가한 내용이 확인되었다. 또한 컨테이너에 OOM Kill 도 발생한 것을 확인할 수 있었다. 그러나 이상한점은 Heap Memory 는 정상적인 수치로 확인되었다. 원인분석Native Memory 에서 OOM 이 발생하였고, Heap Memory 는 정상 적이라 애플리케이션 코드에 문제가 있다고 판단 하였고 관련하여 상기 언급 되었던 배포 항목중 gzip..
Spring Batch + Redis Pipeline 으로 구현한 성능 개선코드 참고는 https://github.com/bkjeon1614/java-example-code/tree/develop/spring-batch-mybatis-codebase 에서 참고 부탁드립니다.Redis Pipeline 이란Redis의 pipeline은 여러 개의 명령어를 한 번에 보내고, 그 결과를 한 번에 받아올 수 있는 메커니즘입니다. 이를 통해 네트워크 오버헤드를 줄이고 Redis 서버의 처리 성능을 최적화할 수 있다. 또한 주의해야할 점은, Redis 서버의 처리량(capacity)을 고려하여 pipeline의 chunk size를 결정해야 한다.주의사항Request Chunk Size: 먼저 요청하는 chunk s..
Java Mutex(뮤텍스) 와 Semaphore(세마포어) 그리고 Spinlock(스핀락)참고코드 Mutex(뮤텍스)Mutex 는 Mutual Exclusion(상호 배제)의 약자이며 Lock(락) 이라고도 한다. Mutex 는 한 번에 하나의 스레드만이 특정 리소스나 코드 섹션에 접근할 수 있도록 한다. 즉, 한 시점에 단 하나의 스레드만이 리소스를 사용할 수 있게 된다. (Lock/UnLock)또한 Java 에서는 ReentrantLock 라는 Lock 인터페이스가 존재하는데 이걸 활용해서 Lock 의 획득과 해제에 대한 부분을 제어할 수 있다. [LockController.java]// 예제코드@RestController@RequestMapping("v1/lock")@RequiredArgsCons..
현재 회사 프로젝트에 대부분이 Map 으로 선언되어 있는 경우가 많다.그로 인하여 무분별한 Map 사용을 지양하기 위해 정리하여 공유할 겸 해당 포스팅을 남긴다. Map 보다 DTO 클래스를 사용해야 하는 이유Map 을 사용할 때 단점Map 의 Key 를 사용할 때 오타 발생 유발Map 의 key 입력에 오타를 입력 후 인지하지 못할 수 있음컴파일 에러를 유발할 수 없음Object 와 같은 최상위 클래스로 사용시에 타입 체크를 할 수 없으므로 만약 문제가 생기면 런타임 시점에 알게 될 것이다.가독성이 떨어지며 타입캐스팅 비용이 발생함// 해당 코드와 같이 Map ... 로 되어있으면 Object 에 어떤 타입인지 유추도 안될 뿐더러 Map 안에 또 다른 Map 이 존재하는 경우 더욱 심각해진다.Map t..
Java ThreadLocal참고코드 Java ThreadLocal 이란Spring Bean 은 싱글톤으로 등록이 된다. 이러한 상황에서 하나의 인스턴스에 여러개의 스레드가 동시에 접근하면 동시성 문제가 발생하게 된다.이러한 경우 스레드 세이프하게 하려면 ThreadLocal 을 사용하면 된다. ThreadLocal 은 해당 Thread 만 접근할 수 있는 특별한 저장소를 말한다. 즉, 각 Thread 마다 별도의 내부 저장소를 제공 동시성 문제 예제하기 코드를 실행해보면 동시성 문제가 발생한다.[ThreadLocalServiceTest.java]package com.example.bkjeon.base.services.api.v1.thread.service;import lombok.extern.slf4j..
Java Fork Join Pool 과 비동기 프로그래밍예제코드예제코드 Fork Join Pool 이란ForkJoinPool 은 Java7부터 사용가능하며 동일한 작업을 여러개의 Sub Task로 분리(Fork)하여 각각 처리하고, 이를 최종적으로 합쳐서(Join) 결과를 만들어내는 방식이다. 즉, 대규모 작업을 빠르게 처리하는데 용이하다. 비동기 프로그래밍 (CompletableFuture, ForkJoinPool)CompletableFuture (Java8 부터 도입)CompletableFuture 는 기존의 Future 인터페이스를 개선한 인터페이스다. 즉, 해당 인터페이스를 사용하면 동기적은 수행 방식을 비동기적인 수행 방식으로 변환하여 성능을 개선하고, 더 유연한 비동기 처리 로직을 구현할 수 ..
이전글: https://bkjeon1614.tistory.com/782 [Spring Actuator] Example 2편 - 각 Info Endpoint 설명 및 Custom Info Endpoint 생성 설명 각 Info Endpoint 설명 및 Custom Info Endpoint 생성 설명 Health Endpoint show-details health 정보에서 components > diskSpace 의 details 필드에 상세 정보를 보여줌 [application.yml] ... management: endpoint: health: show-details: alway bkjeon1614.tistory.com 각 Info Endpoint 설명 및 Custom Info Endpoint 생성 설명..
원인 원인은 Redis 의 Packet Loss 가 발생하였고 해당 애플리케이션의 전체 Pod 에서 OOM 이 발생하면서 재시작되는 현상이였고 Pod 의 Heap 메모리 사용량은 여유가 있는 상태였습니다. 왜 이러한 문제가 발생하였는지 알아보겠습니다. 컨테이너에서 OOM 발생 먼저 서버로그를 확인해본 결과 Gzip 압축 적용후에 점진적으로 메모리 사용량이 증가한 내용이 확인되었다. 또한 컨테이너에 OOM Kill 도 발생한 것을 확인할 수 있었다. 그러나 이상한점은 Heap Memory 는 정상적인 수치로 확인되었다. 원인분석 Native Memory 에서 OOM 이 발생하였고, Heap Memory 는 정상 적이라 애플리케이션 코드에 문제가 있다고 판단 하였고 관련하여 상기 언급 되었던 배포 항목중 g..
시작에 앞서 먼저 Java8 부터 삭제되는 영역인 Permanent Generation 부터 알아보자면 Class 혹은 Method Code 가 저장되는 영역이다. 줄여서 PermGen 이라고 하며, Heap 영역에 속한다. PermGen 에는 로드된 클래스의 정보, 정적 변수, 상수 정보 등 변하지 않을 것이라고 어느 정도 보증되는 데이터가 저장된다고 한다. PermGen -> Metaspace 영역으로 변경된 이유 PermGen 은 메모리가 제한되기 때문에 OOM(=OutOfMemoryError) 이 발생하게 된다. 그래서 해당 문제를 해결하기 위해 Native 메모리를 사용하는 Metaspace 로 변경되었으며 Metaspace 영역은 Native 메모리를 이용함으로써 개발자는 영역 확보의 상한을 ..