반응형

분류 전체보기 16

Kubernetes OOM 원인: JVM MaxRAMPercentage

상황 설명운영 중인 Kubernetes 환경에서 Pod가 주기적으로 **OOMKilled(Out Of Memory)**로 인해 재시작되는 현상이 발생. 결론 먼저사용하고 있던 jvm의 버그-> jdk 1.8(432) 버전 사용 중이었는데 k8s 환경에서 MaxRAMPercentage 옵션 사용시 Pod가 아닌 Node 메모리를 기준으로 하는 버그가 존재 (찾아보면 jdk 1.8(372)에서 해결된 버그라고 나오지만 실제 테스트 해보면 그렇지 않았다) 확인 과정여러가지 삽질했던 기록은 생략1. Pod 터미널에 들어가서 JVM 메모리 설정 확인jcmd {pid} VM.flags명령어 실행시 jvm 설정 정보들이 나온다..... -XX:MaxHeapSize=6092226560 .....약 6GB 로 Pod의 ..

Troubleshooting 2026.02.18

Java Collection - List

가장 자주 비교되는 ArrayList와 LinkedList 그리고 Array하고는 어떻게 다른지 확인해보자ArrayList의 경우 실제 내부에 Array구조를 가져가고 있다.class ArrayList { Object[] data; E get(int index) { return (E) data[index]; }} 결국 ArrayList도 내부적으로 Array형태를 가져가고 있지만, 핵심은 동적인 리사이징 기능이다.Array의 경우 최초에 선언한 사이즈에서 조절이 불가능하다. ArrayList의 경우 초기 설정한 size보다 더 많은 양의 데이터가 들어올 경우 자동으로 사이즈를 조절하여 새로운 배열에 데이터가 쌓인다.그렇다면 ArrayList에 무작정 데이터를 적재하면 어떻..

JAVA 2025.08.08

Java Collection - Map

아마 가장 많이 사용하는 Map은 HashMap일 것이다.HashMap의 구조에 대해서 살펴보자 HashMap key값에서 value를 찾을 수 있는 O(1) 형태의 데이터 구조이다.Java의 모든 객체는 hashCode()와 equals() 메소드를 가지고 있다.Node>[] table;public V get(Object key) { int index = object.hashCode() % 16; List list = table[index]; for(int i = 0; i 객체의 hashCode()를 통해 index의 위치를 탐색하기 때문에 O(1) 형태의 구조를 가지지만 hash충돌이 많을 경우 O(n)의 구조를 가져갈 수 있으니 hashCode(), equals()를 재구현해야할 경우 주의가..

JAVA 2025.08.08

Java IO vs NIO

java.io, java.nio (new input/output)io는 blocking, nio 는 non-blocking 방식(blocking도 지원)io는 stream 형식으로 입출력, nio는 channel 형식으로 입출력이라고 하지만 결국에는 커넥션을 맺는건데 이게 왜 중요할까???예를 들어 이렇게 생각할 수 있을거 같다."실제로 데이터를 끊어서 읽어온다음 처리하는게 아니라 다 읽어오고 나서 처리하는건데 non-blocking 되는게 필요한거야?"(물론 끊어 읽어와서 처리하는 것도 가능은하다.이런 의문은 소스코드를 보면 더 커진다.InputStream in = socket.getInputStream();byte[] buffer = new byte[1024];int len = in.read(buff..

JAVA 2025.07.20

Java Collection Framework

A collection is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.— Collections Framework Overview, Java SE 8Oracle JDK에서는 Collection에 대해서 데이터를 저장하고 조작하는 표준화된 방식을 제공하고 있다고 설명하고 있다. Collection Framework를 제공함으로써 다음과 같은 이점을 가질 수 있다고 한다.1. 프로그래밍 작업을 줄일 수 있다.2. 성능을 향상시킨다.3. 관련 없는 API간 상호운용성을 제공한다.4. ..

JAVA 2025.07.12

Blocking vs Non-Blocking, Synchronous vs Asynchronous

구분BlockingNon-BlockingSynchronousAsynchronous의미요청이 끝날 때까지 기다림요청하고 바로 제어권 반환호출자가 결과를 직접 기다림호출 후 결과는 콜백/이벤트로 전달됨예시파일 읽기 완료까지 멈춤읽을 게 없으면 즉시 리턴A → B → 결과 기다림 → 다음A → B 호출만 하고 → 다음 코드 실행대표 상황전통 IONIO일반 함수 호출Future, Callback, Reactor 위의 비교가 어렵다면 다음과 같이 비교해보도록 하자Blocking vs Non-Blocking은“작업이 끝날 때까지 기다릴 것이냐, 말 것이냐”의 차이→ "작업 진입 시점의 차이"Synchronous vs Asynchronous는“결과를 직접 받느냐, 나중에 받느냐”의 차이→ "작업 종료 시점의 처리 방..

JAVA 2025.04.21

JVM 메모리 구조

Method Area클래스 정보(메서드, 필드, static 변수 등)를 저장ClassLoader에 의해 로딩된 클래스들의 메타데이터가 올라간다.Java 8 이전에는 PermGen, 이후에는 Metaspace로 대체됨모든 thread가 함께 사용해당 영역 안에 Runtime Constant Pool이 존재Heap Area모든 객체 인스턴스(new)가 생성되는 영역GC의 주요 대상모든 thread가 함께 사용Stack Area메서드 호출 시 로컬 변수, 매개 변수, 리턴 주소 저장PC register현재 실행 중인 JVM 명령의 주소를 저장Native Method StackJVM이 아닌 Native code(C, C++ 등)를 실행할 때 사용하는 Stack public class Example { // M..

JAVA 2025.04.19

JVM GC(Garbage Collection)

C언어의 경우 malloc/free 를 통해서 프로그래머가 직접 메모리를 할당하고 해제해주지만 JVM의 경우에는 메모리를 알아서 관리해주고 있기 때문에 개발자가 직접 관리할 필요가 없어진다. JVM에 다양한 메모리 영역이 존재하는데 그 중에서도 Heap영역에서 다음과 같이 GC가 동작한다.Eden, Survivor, Old 영역들이 존재하는데 간단하게 객체가 생성(new Object()) 되면 Eden Space에 생겨난다.그러고 나서 아직 참조가 되고있는 객체 더이상 참조 되지 않는 객체를 분류한다. 위의 그림에서 Object2가 Mark되어지고 MinorGC에 의해서 메모리 할당이 해제된것으로 보면 된다.그렇게 생존한 객체들이 존재하는 Survivor영역을 왔다갔다 하면서 오래 살아남은 객체는 Old..

JAVA 2025.04.19

JVM(Java Virtual Machine: 자바 가상 머신)

JVM은 하드웨어 및 운영 체제에 독립적인 실행 환경을 제공하며, 컴파일된 코드의 크기를 줄이고, 악성 프로그램으로부터 사용자를 보호하는 역할을 한다. - Oracle Javadoc JVM이 어떻게 저런걸 가능하게 할까?C언어의 경우에는 윈도우용 컴파일러, 리눅스용 컴파일러가 각자 컴파일을 진행하여 실행파일을 만들지만 Java의 경우에는 각 환경에 맞는 JVM이 따로 존재하기 때문에 자바 컴파일러(javac)가 번역한 class file을 어느환경에서나 실행이 가능해진다. 여기서 만들어진 byte code는 JVM이 실행할 수 있는 추상적인 명령어 집합이므로 기계어보다 간결하다. CPU 명령어, 레지스터 정보 등 다양한 정보를 포함해야하는 기계어보다 컴파일된 코드의 사이즈는 작아진다. 이 때, clas..

JAVA 2025.03.13
반응형