일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jsp
- AWS
- ReactJS
- Spring Batch
- MySQL
- Spring Boot
- java
- tool
- ubuntu
- devops
- db
- laravel
- Git
- springboot
- javascript
- Oracle
- Spring
- 맛집
- elasticsearch
- jenkins
- Web Server
- php
- JVM
- Gradle
- IntelliJ
- linux
- it
- redis
- Design Patterns
- 요리
- Today
- Total
목록Java & Kotlin/Java (105)
아무거나
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 메모리를 이용함으로써 개발자는 영역 확보의 상한을 ..
Heap 모니터링 및 Heap Dump 분석 Heap 모니터링 OracleJDK 에서 제공하는 GUI 모니터링 툴 VisualVM 을 다운 VisualVM 상단에 [Tools] - [Plugin]을 접속하여 VisualGC 플러그인을 다운 플러그인 다운이 끝났다면, 창을 종료하고 좌측 메뉴를 확인 후 프로세스 클릭 Monitor 및 Visual GC 를 통하여 각 원하는 항목들을 모니터링한다. Heap Dump 분석 OOM 을 발생시킬 코드 작성 [TestController.java] package com.example.bkjeon; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotatio..
Setter 사용을 지양하자. 값을 변경한 의도를 파악하기 힘듬 // 어떤 의도로 데이터를 변경하는지 명확히 알 수 없다. public Member updateMember(long id) { final Member member = findById(id); member.setFistName("value"); member.setLastName("value"); member.setAge("value"); return member; } 객체의 일관성을 유지하기 어려움 public 으로 언제든 변경할 수 있는 상태가 되므로 모든 곳에서 변경이 할 수 있는 상태가 되므로 객체의 일관성을 유지하기 어렵다. Setter 대신 다른 것을 사용 필요 생성자를 오버로딩 (멤버변수가 많고 다양한 생성자를 가져야 한다면 코드가..
Chunk-Oriented Processing (Chunk 지향 처리) 이전글: Spring Batch 5편 - Spring Batch Scope & Job Parameter 작업코드: 작업코드 Chunk Spring Batch 의 Chunk 란 각 커밋 사이에 처리되는 row 수를 의미한다. 즉, 한 번에 하나씩 데이터를 읽어 Chunk 라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것 을 Chunk 지향 처리라고 한다. 또한 Chunk 단위로 트랜잭션을 수행하기 때문에 실패한 경우엔 해당 Chunk 만큼만 롤백 이 되며, 이전에 커밋된 트랜잭션 범위까지는 반영된다. 상기 이미지의 프로세스는 아래와 같다. Reader 가 누적해서 읽어 Chunk Size 를 맞춤 Processor 에선 ..
Java Stream 이란 개념은 알고 있지만 한 번 정리가 필요할 것 같아서 해당 포스팅을 작성하게 되었다. Stream 우리는 수 많은 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기위해 for 문이나 Iterator 를 이용하여 코드를 작성해왔다. 그러나 이러한 코드는 가독성과 재사용성이 떨어진다. 또한 Collection 이나 Iterator 와 같은 인터페이스를 활용하여 컬렉션을 다루는 방식을 표준화하기는 하였지만. 각 컬렉션 클래스에는 같은 기능의 메서드들이 중복해서 정의되어 있다. 예를 들면 List 를 정렬하려면 Collections.sort() 를 사용하거나 배열은 Array.sort() 를 사용해야 한다. 이러한 문제점들을 해결하기 위해서 Java8 부터 추가된것..
최근에 JVM 관련 대화를 나누던 도중 메모리 영역에 대한 잘못된 설명을 해버린적이 있다. 반성하는겸 다시 정리하고자 해당 포스팅을 작성하게 된다. Java 메모리(with. JVM) 정의 Stack: 정적 할당된 메모리 영역 boolean, char, short, int, long, float, double.. 등과 같은 데이터 즉, 원시타입의 데이터가 값이랑 같이 Stack 에 할당된다. Heap 영역에서 Object 타입 데이터의 참조값이 Stack 에 할당된다. Stack 의 메모리는 Thread 당 하나씩만 할당된다. 즉, 새로운 Thread 생성시 그 해당 Thread 에 대한 Stack 이 또 새롭게 생성된며 각 Thread 끼리는 Stack 영역을 접근 할 수 없다. 간단한 사용예시 pub..