
작은 파란색 원 : Oracle 문서에서는 regular young-only collection 이라고 표현, Young 영역에 대한 GC 발생 (STW) 작은 분홍색 원 : Oracle 문서에서는 multiple mixed colletions 이라고 표현, Young 과 Old 영역 모두에 대한 GC 발생 (STW) 원의 크기는 STW 의 소요 시간과 비례한다. G1GC 는 regular young-only collection 만 주기적으로 진행 GC 로그 상 Eden 영역이 가득 찼을때 regular young-only collection 이 트리거되는것으로 보임 regular young-only collection 만 진행하다가 Old 영역의 사용량이 임계치에 도달하면 Initial Mark 단계를..
운영 중인 서버에서 ConcurrentModificationException 가 발생하여 원인 파악을 시작하였다. 예외가 발생한 코드 재현 Map reduce = IntStream.range(0, 100) .parallel() .mapToObj((num) -> { Map map = new HashMap(); map.put(num, num); return map; }) .reduce(new HashMap(), (a, b) -> { a.putAll(b); return a; }); 에러가 발생한 로직을 간단하게 요약하면 위와 같이 정리가 되는데 운영 코드에서는 mapToObj 부분에서 I/O 를 실행하고 있다. I/O 를 Parallel 하게 실행하기 위하여 Stream 의 Parallel 을 사용하고 있다...

ExecutorService executorService = Executors.newFixedThreadPool(3); Stream.of(3, 2, 1) .map((i) -> CompletableFuture.supplyAsync(() -> { try { System.out.println(Thread.currentThread().getName() + " : start"); Thread.sleep(i * 1000L); System.out.println(Thread.currentThread().getName() + " : end"); } catch (InterruptedException e) { throw new RuntimeException(e); } return i; }, executorService)) ..

TLS 는 SSL 과 같은 의미이여 TCP 통신에서 오고가는 데이터를 암호화하기 위한 프로토콜이다. TLS 과정 인증서 발급 TLS 인증을 하고자하는 서버가 CA (Certifiacate Authorities : 인증서 발급 기관) 로부터 인증서를 발급 받는다. Server 는 공개키/비공개키를 생성하고 인증서 신청시 공개키를 CA 에 전달 CA 는 인증서에 Server 의 공개키를 포함하여 인증서를 생성 CA 는 인증서 내용을 Hash 처리한 값을 CA 의 비밀키로 암호화하여 인증서에 포함 TLS 연결 Client 와 Server 가 HTTP Handshake 이후에 TLS 인증 절차를 거친다. Client 는 Server 에게 ssl 버전, 사용 가능한 암호화 프로토콜등을 전달한다. Server 는 ..

Object.wait() : 현재 Object Monitor 를 획득하고 있는 Thread 의 Monitor 소유권을 해제하고 Thread 를 WAITING 상태로 만든다. wait() 메서드는 synchronzied 블록 안에서만 호출 가능하다. 중요한 것은 Lock 을 해제하고 Thread 가 WAITING 상태가 된다는 것! Object.notify() : 해당 Object Montior 의 WAITING 상태인 Thread 들 중 하나를 깨운다. 깨어난 Thread 는 Lock 을 얻기 위한 경쟁 상태인 BLOCKED 상태가 된다. Object.notifyAll() : 해당 Object Monitor 의 WAITING 상태인 Thread 들 전부를 깨운다. notify() 와 마찬가지로 깨어난 ..

StringBuilder 와 StringBuffer 모두 AbstractStringBuilder 를 상속받아 메서드를 구현하고 있다. 두 클래스는 모두 String 을 만들기 위해 사용되지만 어떤 차이점으로 인해 구분되어있는지를 확인해본다. append() 함수로 알아보는 두 클래스의 차이 StringBuilder.java 의 append() 함수 @Override public StringBuilder append(String str) { super.append(str); return this; } StringBuffer.java 의 append() 함수 @Override public synchronized StringBuffer append(String str) { toStringCache = null..

pmap 커맨드를 사용하면 linux process 의 가상 메모리 주소의 대역과 Mapping 된 결과를 확인할 수 있다. 10: java -Xms30m -Xmx30m -verbose:gc -XX:+UseG1GC Main Address Kbytes RSS Dirty Mode Mapping 00000000fe200000 31232 30364 30364 rw--- [ anon ] 00000000fe200000 0 0 0 rw--- [ anon ] 0000000100080000 1048064 0 0 ----- [ anon ] 0000000100080000 0 0 0 ----- [ anon ] 0000562ecc068000 4 4 0 r-x-- java 0000562ecc068000 0 0 0 r-x-- ja..

https://woooongs.tistory.com/85 -Xms 보다 Memory 사용량이 더 적은 이유 Logstash 는 JVM 에서 동작중이며 -Xms (최소 힙 크기 사이즈) 는 1g 로 실행되었다. 하지만 메트릭에서 보는 것 처럼 Java process 가 사용하는 메모리는 572MB 로 최소 힙 크기보다 적은 양의 메모리를 사 woooongs.tistory.com 위 글에서 최소 힙 사이즈보다 사용중인 물리 메모리가 더 작은 이유에 대해서 확인해보았다. JVM 은 가상메모리에는 최소 힙 사이즈 만큼 공간을 할당하지만 실제로 객체를 힙에 저장하기 전까지는 물리 메모리를 점유하지 않는다. 하지만 위 글에서 해결되지 않는 의문이 있었다. 객체가 실제로 힙에 저장될때 Java process RSS ..

Logstash 는 JVM 에서 동작중이며 -Xms (최소 힙 크기 사이즈) 는 1g 로 실행되었다. 하지만 메트릭에서 보는 것 처럼 Java process 가 사용하는 메모리는 572MB 로 최소 힙 크기보다 적은 양의 메모리를 사용하고 있다고 메트릭은 표현하고 있다. 어떻게 최소 힙 크기보다 적은 양의 메모리를 사용하고 있을까? 라는 궁금증이 생겼다. 우선 해당 메트릭은 Kubernetes 의 cAdvisor 에 의해서 수집되는 지표이다. cAdvisor 가 수집하는 여러가지 메모리 지표중 container_memory_working_set_bytes 를 사용하여 메모리 사용량을 나타내고 있다. cAdvison 코드에 보면 container_memory_working_set_bytes 는 아래와 같이..

Unreachable 객체 필터링 방법 우선 Unreachable 객체까지 파싱되도록 설정하여 힙덤프를 불러온다 https://woooongs.tistory.com/78 Heapdump 의 크기와 Mat 으로 Parsing 한 힙 크기가 다르다면 Heapdump 크기 : 1.5G Parsing 결과 : Total 357.3MB Unreachable (GC 대상) 객체는 MAT 기본 설정으로 파싱하지 않도록 되어있다. Unreachable 객체까지 Parsing 하기 위해서는 Preferences > Memory Analyzer.. woooongs.tistory.com Java Basics > GC Roots 버튼 클릭 Unreachable 항목이 GC 대상이 되는 참조가 없는 객체들 하지만 아래와 같이 ..
- Total
- Today
- Yesterday
- GlobalFilter
- ResultSet
- RoutePredication
- dynamodb
- AbstractMethodError
- MariaDB
- rate limit
- RouteDefinition
- Seperate Chaining
- Lazy
- wait()
- getBoolean
- aurora
- circurit breaker
- router
- notify()
- N+1
- reative
- mariada-connector
- notifyAll()
- Flux
- mariadb-connector-j
- spring cloud gateway
- DyanomoDB
- reactor
- msyql-connector-java
- HashMap
- ConcurrentHashMap
- custom config data convertion
- referencedColumnName
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |