항해99 기술면접 대비

23.10.15 항해 99 16기 기술면접 대비

김용글 2023. 10. 15. 19:29

1. JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?

 1) 스택(Stack)

     프로그램이 자동으로 사용하는 임시메모리 영역이다

     함수 호출시 생성되는 지역변수와 매개변수가 저장되는 영역이고, 함수 호출이 완료되면 사라진다

     이때, 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)라고 한다

     스택 영역에서 푸쉬(push)로 데이터를 저장하고, 팝( pop)로 데이터를 인출한다 

     후입 선출 (LIFO Last-in First-Out) 방식으로 가장 나중에 들어온 데이터가 가장 먼저 인출 되는데 이는 메모리의

     높은 주소에서 낮은 주소의 방향으로 할당 되기 때문이다

     또한, 정적으로 할당된 메모리 영역이고 정해져 있는 기본형 변수를 저장하면서 크기가 정해져 있는 참조형 변수의

     주소값도 저장한다

     힙(Heep) 영역에 생성된 Object 타입의 데이터 참조값이 할당되고 원시 타입의 데이터가 값고 함께 할당되는데

     원시타입의 데이터는 힙(Heep) 메모리에 할당되지 않는다

     원시 타입 : byte, short, int, long, double, float, boolean, char

     지역변수들은 scope에 따른 visibility를 가진다

     각 Thread는 자신만의 stack을 가진다

 

 2) 힙(Heep)

     프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다

     malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다

     선입선출 (FIFO First-In First-Out)의 방식으로 가장 먼저 들어온 데이터가 가장 먼저 인출되는데 이는 메모리의

     낮은 주소에서 높은 주소의 방향으로 할당 되기 때문이다

     또한, 동적으로 할당된 메모리 영역이고 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장한다

     주로 긴 생명주기를 가지는 데이터들이 저장된다(대부분의 객체는 크기가 크고 서로 다른 코드블럭에서 공유되는

     경우가 많다)

     애플리케이션의 모든 메모리중 스택(Stack)에 있는 데이터를 제외한 부분이라고 보면된다 모든 Object 타입 

     (Integer, String, ArrayList,...)의 참조값은 데이터 타입과 함께 생성된다

 

  * 지역변수
    블록 안에 선언되는 변수를 이야기한다 블록안에서만 유효하고 벗어나게 되면 메모리에서 사라지고 의미가 없어진다

 

  *매개변수 

    함수 등에서 사용되는 전달된 값을 받는 변수

 

  * 쓰레드(Thread)

    하나의 프로세스(실행중인 프로그램) 안에서 독립적으로 실행되는 작은 실행단위

    자바에서는 멀티쓰레드를 지원하여 하나의 프로세스 안에 한 개 이상의 쓰레드를 지원하는 구조이다

 

2. 클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?

 1) 클래스

     Java에서 객체를 생성하기 위한 일종의 설계도이다

     객체가 가지고 있는 속성(필드)와 동작(메서드)로 이루어져있다 이들은 생략될 수도 있고 하나이상 작성될 수도있다

 2) 인스턴스

     클래스를 통해 생성된 객체 하나하나를 해당 클래스의 인스턴스라고 한다

     클래스를 사용해서 힙(Heep)영역에 새로운 인스턴스를 생성할 수 있다 즉 현실의 객체를 소프트웨어 내에서 구현한

     실체이다

 

  * 객체

     소프트 웨어 세계에 구현할 대상이고 클래스에 선언된 모양 그대로 생성된 실체이다

     클래스의 인스턴스라고도 부르고 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다

 

3. Garbage Collector의 역활, 원리, 알고리즘에 대해 아는 만큼 설명해주실 수 있을까요?

 1) Garbage Collector의 역활

     자동 메모리 관리 시스템으로 힙(Heap)영역에서 동적으로 할당 했떤 메모리중 필요 없게된

     메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스

     (1) 특징

          (a) 동작은 자바에 의해 자동 실행되거 어느 시점에 어디에서 시작할지에 따라 다르다

          (b) 동작하면 어플리케이션에 있는 모든 쓰레드들은 잠시 중단된다

 

 2) Garbage Collector의 원리

     Mark And Sweep 이란 다양한 GC에서 사용되는 객체를 솎아내는 내부 알고리즘이며 아주 기초적인 청소과정이다

     대상 객체를 식별(Mark) 하고 제거(Sweep) 하며, 객체가 제거되어 파편화된 메모리 영역을 앞에서부터 채워나가는

     작업(Compaction)을 수행한다

     (1) Mark 과정 : 먼저 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고

                              있는지 마킹함

     (2) Sweep 과정 : 참조하고 있ㄴ지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거

     (3) Compact 과정 : Sweep 이후 분산된 객체들을 heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않는

                                    부분으로 압축함 (GC의 종류에 따라 하지않는 경우도 있다)

     

 3) Garbage Collector의 동작과정

     (1) 힙(Heep) 메모리 구조

          A) Young

                - 새롭게 생성된 객체가 할당 되는 영역

                - 대부분의 객체가 금방 (Unreachable) 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라짐

                - Young 영역에 대한 GC를 Minor GC라고 부른다

                - Young 영역을 3가지 영역으로 나눔

                  (a) Eden

                       - new 를 통해 새로 생성된 객체가 위치

                       - 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보냄

                  (b) Survivor 0 / Survivor 1

                       - 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역

                       - 특별한 규칙이 있는데 Survivor 0 / Survivor 1 둘 중 하나에는 꼭 비어있어야 한다

          B) Old

                - Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역

                - Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다

                  크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요하지 않으며 큰 객체들은 바로

                  Old 영역에 할당되기 때문

                - Old 영역에 대한 GC를 Major GC 또는 Full GC 라고 부른다

 

 3) Garbage Collector의 알고리즘

     자바의 발전에 따라 힙(Heap)의 사이즈가 커지면서 애필리케이션의 지연 현상이 두드러지게 되었고 이를 최적화

     하기위해 다양한 알고리즘이 개발되었다

     (1) Serial

          (a) 서버의 CPU 코어가 1개일 때 사용하기 위해 개발된 가장 단순한 GC

          (b) GC를 처리하는 쓰레드가 1개 여서 가장 stop-the-world 시간이 길다

          (c) Minor GC에는 Mark-Sweep를 사용하고,Major GC에는 Mark-Sweep-Compact를 사용한다

          (d) 보통 실무에서 사용은 거의하지 않는다 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용)

    (2)  Paraller GC

          (a) Java 8 의 디폴트 GC

          (b) Serial GC와 기본적인 알고리즘은 같지만 Young 영역의 Minor GC를 멀티 쓰레드로 수행

               (Old 영역은 싱글쓰레드)

          (c) Serial GC에 비해서 stop-the-world 시간 감소

     (3) Paraller Old GC (Parallel Comacting Collerctor)

          (a) Paraller GC를 개선한 버전

          (b) Young 영역 뿐만 아니라 Old 영역에서도 멀티 쓰레드로 GC 수행

          (c) 새로운 가비지 컬렉션 청소 방식인 Mark-Summary-Compact 방식을 이용 (Old 영역도 멀티 쓰레드)

     (4) CMS GC (Concurrent Mark Sweep)

          (a) 어플리케이션의 쓰레드와 GC 쓰레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안됨

          (b) 단 GC 과정이 매우 복잡해짐

          (c) GC 대상을 파악하는 과정이 복잡한 여러 단계로 수행되기 때문에 CPU 사용량이 높다

          (d) 메모리 파편화 문제가 있음

          (e) Java 9 버전부터 depreacted 되었고 Java 14 에서는 사용이 중지됨

      (5) G1 GC (Garbage First)

          (a) CMS GC를 대체하기 위해 jdk 7 버전에서 최초로 release 된 GC

          (b) Java 9+ 버전의 디폴트 GC

          (c) 4GB 이상의 힙 메모리, Stop the World 시간이 0.5초 정도 필요한 상황에 사용

               (Heap이 너무 작을 경우 미사용 권장)

          (d) 기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용했지만

               G1 GC는 아에 이러한 계념을 뒤엎는 Region이라는 개념을 도입해 사용

     (6) Shenandoah GC

          (a) Java 12에 release

          (b) 레드 햇에서 개발한 GC

          (c) 기존 CMS가 가진 단편화, G1이 가지 pause의 이슈를 해결

          (d) 강력한 Concurrency 와 가벼운 GC 로직으로 Geap 사이즈에 영향을 받지 않고 일정한 pause 시간 소요가 특징

     (7) ZGC (Z Garbage Collector)

          (a) Java 15에 release

          (b) 대량의 메모리 (8MB ~ 16TB) 를 low-latency로 잘 처리하기 위해 디자인된 GC

          (c) G1의 Region 처럼 Z page 라는 영역을 사용하며 G1의 Region은 크기가 고정인데 비해 2mb 배수로 동적으로

              운영됨 ( 큰 객체가 들어오면 2^으로 영역을 구성해서 처리)

          (d) 최대 장점 중 하나는 Heap 크기가 증가하더라도 stop-the-world의 시간이 절대 10ms를 넘지 않는 다는 것

 

  * stop-the-world

    GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상

    GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있다

 

  * Region

    전체 Heap 영역을 체스 같이 분할하여 상황에 따라 Edan, Survivor, Old 등 역활을 고정이 아닌 동적으로 부여