 
        
      
      
        
          NUMA와 JVM과 k8s
        
        
      
    
          
            
            2025. 10. 31. 20:14
          
          
            
            Java & Kotlin
          
        
        1. NUMA란 무엇인가CPU가 빠르게 발전하던 시기, 컴퓨터는 코어를 점점 더 많이 탑재하기 시작했다. 이때 문제는 메모리였다. 모든 CPU가 동일한 메모리 버스 하나에 매달리는 구조 (UMA, Uniform Memory Access)에서는 CPU 수가 늘어날수록 메모리 접근 대역폭이 병목이 되었다. UMA는 단순하고 일관된 접근 속도를 제공하지만 확장성 면에서 구조적인 한계가 존재했다. 이 시점에서 하드웨어 엔지니어들은 “CPU마다 자기 전용 메모리를 붙여주면 어떨까”라는 발상을 하였다. 이 발상이 바로 NUMA(Non-Uniform Memory Access)의 시작이다.NUMA의 핵심 아이디어는 간단하다. CPU가 많은 시스템에서, 모든 CPU가 하나의 메모리 풀을 공유하기보다는 각 CPU(소켓)에..
       
        
      
      
        
          [Java] Java 프로세스 메모리 - Reserved, Committed, RSS 이해하기
        
        
      
    
          
            
            2025. 10. 19. 18:54
          
          
            
            Java & Kotlin
          
        
        1. 들어가며서버를 운영하다보면 힙 설정을 하였는데 k8s pod OOM kill이 나기도 하고, jcmd로 본 JVM 메모리 사용량과 top으로 본 Java 프로세스의 메모리가 차이가 나기도 한다. Java 프로세스가 사용하는 메모리는 단순히 -Xmx로 정한 힙 크기로 끝나지 않는다. JVM은 메모리를 예약(Reserved)하고, 그 중 일부를 커밋(Committed) 해서 논리적으로 확보한 뒤, 필요할 때마다 OS가 실제 물리 메모리(RAM)를 할당하는 과정을 거친다. 즉, JVM과 OS는 다른 기준으로 메모리를 바라본다. JVM은 “쓸 수 있는 공간”을 기준으로, OS는 “이미 매핑된 페이지”를 기준으로 계산하는 것이다. 이 글에서는 JVM의 메모리 관리 단계를 Reserved → Committed..
       
        
      
      
        
          [Java] TypeReference는 어떻게 동작하는거지?
        
        
      
    
          
            
            2025. 10. 8. 22:40
          
          
            
            Java & Kotlin
          
        
        0. 들어가며ObjectMapper 관련 코드를 쓰다보면 아래와 같이 TypeReference를 사용하곤한다.ObjectMapper objectMapper = jacksonObjectMapper();objectMapper.readValue(json, new TypeReference>() {});자바의 제네릭은 컴파일 이후 타입소거가 이루어지는데 위와 같은 코드는 어떻게 동작할 수 있는거지 싶어 해당 내용에 대해 찾아본 내용을 정리한다. 1. 타입 소거 간단 요약자바는 제네릭을 도입할 때 하위 호환성을 위해 타입 소거라는 메커니즘을 도입했다. 컴파일 이후 제네릭에 bound가 있었다면 해당 타입으로, 그렇지 않다면 Object 타입으로 치환되며, 이로 인해 바이트 코드 상에서는 제네릭 정보가 사라진다. 이..
       
        
      
      
        
          [Java] JVM -XX: +AlwaysPreTouch 옵션 알아보기
        
        
      
    
          
            
            2025. 3. 1. 17:44
          
          
            
            Java & Kotlin
          
        
        0. 들어가며자바 애플리케이션을 운영하면서 JVM의 다양한 옵션을 접하게 됩니다. 그 중 성능 튜닝에 유용한 옵션으로 -XX:+AlwaysPreTouch가 있습니다.이번 글에서는 JVM 메모리 구조와 운영 체제의 메모리 관리 기초를 살펴본 뒤, -XX:+AlwaysPreTouch 옵션이 무엇을 하는지, 활성화/비활성화 시의 차이는 무엇인지, 어떤 상황에서 유용한지와 성능 영향, 그리고 간단한 실험 결과까지 알아보겠습니다.  1. JVM 메모리 구조와 메모리 관리 기초1.1 JVM 메모리 구조JVM은 실행 시 여러 메모리 영역을 사용합니다. 그 중 힙(heap)은 보통 가장 큰 영역으로, 애플리케이션이 동적으로 할당한 객체들이 저장되는 공간입니다.-Xmx 옵션으로 설정한 최대 힙 크기까지 객체를 저장할 수..
       
        
      
      
        
          [Kotlin] 코틀린에서의 제네릭에 대하여.
        
        
      
    
          
            
            2023. 8. 31. 01:09
          
          
            
            Java & Kotlin
          
        
        0. 들어가며 🏃🏻♂️ 이번 글은 코틀린에서의 제네릭과 관련된 내용을 정리해보려합니다. 제네릭과 공변에 대한 내용은 한번 제대로 정리해보고 싶었는데 마침 코틀린 인 액션을 읽고 코틀린의 제네릭에 대해 배우게 되었습니다. 자바와 비슷하면서도 다른 기능들을 제공해주는데 제네릭 개념과 함께 이를 정리해보겠습니다. 본 글은 자바 혹은 코틀린 제네릭에 대한 문법정도는 알고 읽어야 도움이 되실 것 같습니다. 1. 들어가기 전 코드 베이스 설명 제네릭과 공변 관련 개념을 설명하기위해 본 글에서는 아래와 같은 코드를 예시로 사용하려 합니다. 간단한 코드이니 한번 살펴봐주세요! // 동물 open class Animal(val name: String) // 포유류 open class Mammal(name: String..
       
        
      
      
        
          [Kotlin] Kotlin In Action을 읽고나서.
        
        
      
    
          
            
            2023. 8. 22. 16:51
          
          
            
            Java & Kotlin
          
        
        0. 들어가며🏃🏻♂️ 최근 여러 회사들의 기술 스택을 보면 자바 대신 코틀린을 사용하는 경우가 많이 있는 것 같습니다. 저 또한 회사에서 코틀린을 사용하고 있는데 과연 내가 코틀린스럽게 사용하고 있는걸까? 라는 의문이 드는 순간들이 많았던 것 같습니다. 이에 코틀린 컴파일러 개발자가 직접 썼다는 Kotlin In Action을 읽어보았고, 이에 대한 내용과 생각을 정리해보려 합니다. 1. 코틀린에 대하여😎 많은 자바 개발자들이 자바에 익숙했음에도 불구하고 코틀린으로 기술 스택을 변경해나가는 이유가 무엇일까 궁금했습니다. 이를 알기 위해서는 코틀린의 특징, 철학 등에 대해 먼저 알아보아야 할 것 같은데요. 코틀린 공식문서와 Kotlin In Action에서 설명하는 코틀린을 제 나름대로 요약, 정리해보면..
       
        
      
      
        
          [Java] Arrays.asList 와 List.of 의 차이점에 대하여.
        
        
      
    
          
            
            2023. 3. 9. 18:20
          
          
            
            Java & Kotlin
          
        
        0. 들어가며 🏃🏻♂️ 자바에서는 간단하게 List를 초기화하려할때 Arrays.asList, List.of와 같은 메서드의 도움을 받기도 합니다. 두 메서드는 비슷한 역할을 하는 것 같은데 차이점이 무엇인지에 대해 궁금증이 생겨 글을 정리하게 되었습니다. 1. Arrays.asList 메서드 Arrays.asList는 자바 1.2에서 생긴 메서드로 List 객체를 보다 편하게 생성할 수 있도록 도와주는 메서드입니다. 사용법은 간단하므로 예시를 통해 알아보도록 하겠습니다. // 사용법1 List asList = Arrays.asList(1, 2, 3, 4); System.out.println("asList = " + asList); // asList = [1, 2, 3, 4] // 사용법2 Intege..
       
        
      
      
        
          [Java] Enum에 대하여.
        
        
      
    
          
            
            2022. 10. 13. 23:05
          
          
            
            Java & Kotlin
          
        
        0. 들어가며🏃 지난 글에서 상수를 관리하는 방법으로 유틸리티 클래스를 사용하는 방식을 살펴보았습니다. [Java] 상수들을 관리하는 방법에 대하여. 0. 들어가며🏃 코드를 작성하다 보면 상수를 정의하는 경우가 많이 있습니다. 저 역시 최근 자바 코드를 작성하면서 상수들을 하나하나 정의하다 보니.. 그 수가 많아져 이를 관리해야할 필요성 kjhoon0330.tistory.com 상수를 선언하기 위한 유틸리티 클래스는 직관적이고 그럴듯해 보이지만 몇몇 상황에서 불편한 점이 있습니다. 예시 코드를 통해서 한번 살펴보도록 하죠. class Fruit { // 정수 열거 패턴 static final int APPLE = 1; static final int GRAPE = 2; static final int STR..
       
        
      
      
        
          [Java] 상수들을 관리하는 방법에 대하여.
        
        
      
    
          
            
            2022. 9. 17. 00:27
          
          
            
            Java & Kotlin
          
        
        0. 들어가며🏃 코드를 작성하다 보면 상수를 정의하는 경우가 많이 있습니다. 저 역시 최근 자바 코드를 작성하면서 상수들을 하나하나 정의하다 보니.. 그 수가 많아져 이를 관리해야할 필요성을 느끼게 되었습니다. 상수를 어떻게 관리하면 좋을지 고민하다가 도움이 된 자료들이 있어 이번 글에서는 이에 대한 내용을 정리해보려 합니다. 1. 상수를 관리하는 방법 중 안티 패턴💀 우선 자바에서 상수를 관리하는 방법 중 안티 패턴으로 알려진 몇 가지 방법을 먼저 소개하겠습니다. 1) Magic Number if (nubmer == 3.1415) {...} // 3.1415 => Magic Number 위 코드의 3.1415 같은 수를 Magic Number라고 칭하는데 위와 같이 코드를 작성하면 다음과 같은 문제들이..
       
        
      
      
        
          [Java] var 키워드에 대하여.
        
        
      
    
          
            
            2022. 8. 20. 03:28
          
          
            
            Java & Kotlin
          
        
        0. 들어가며🚶 Java 10부터 도입된 var에 대해 존재는 알고 있었는데 이를 좀 더 정리해볼 시간을 가지고 싶어 이번 글을 작성하게 되었습니다. var에 대해 찾아보니 이를 반대하는 사람도 있고 장점에 대해 말하는 사람들도 있어 왜 정적 타입 언어인 Java에 var 키워드를 도입했는지, 사용 예시는 어떤게 있는지 등에 대해 알아보도록 하겠습니다. 1. var 사용 예시📚 Java 10부터 지역 변수에 대한 Type Inference가 가능한 var 키워드를 제공해줍니다. Type Inference는 제네릭이나 람다식에서도 찾아볼 수 있는데, 타입을 생략하여도 이를 문맥상 충분히 알 수 있으면 컴파일러가 타입을 추론해주는 것을 말합니다. 말로만 설명하면 안와닿을 수 있으니 코드로 살펴보겠습니다. /..