기술면접 질문 정리 - Java(1)

너구리로소이다·2023년 3월 20일
0
post-thumbnail

기술 관련 해서 묻는 질문들은 매번 보고 또 봐도 기억속에 잘 남겨두지 못하는 나를 위해
그때마다 상기할 수 있도록 이렇게 따로 정리해두면서 자주 읽어보는 것이
머리에 남겨 둘 수 있는 최선의 방법이라고 생각한다.

면접 질문 정리



JVM(Java Virtual Machine)이란?

  • 자바가상머신의 약자를 줄여 부르는 용어.

  • Stack(스택)기반의 가상머신.

  • 역할은 자바애플리케이션을 클래서 로더를 통해 읽어들여 자바 api와 함께 실행.
    또한, java와 OS(운영체제)사이에서 중개자 역할을 수행하며, 운영체제에 구애 받지 않고 재사용을 가능하게 해준다.
    마지막으로 메모리관리, Garbage Collection(가비지 컬렉션)을 수행한다.

    왜 JVM를 알아야 하는가?  한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서.

JVM 구성 - Class Loader(클래스 로더)

  • 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한다.
  • JVM내로 .class 파일을 로드하고, 링크를 통해 배치하는 작업수행 모듈.

JVM 구성 - Execution Engine(실행 엔진)

  • 바이트코드를 실제로 JVM내에서 기계가 실행할수 있는 형태로 변환.

    java byte code란? 기계가 바로 수행할 수 있는 언어보다는 사람이 보기 편한 형태
  • 클래스를 실행시키는 역할.

JVM 구성 - Interpreter(인터프리터)

  • 자바 바이트 코드를 명령어 단위로 읽어서 실행.
  • 한 줄 씩 실행하기 때문에 느림.

JVM 구성 - JIT(Just-In-Time)

  • 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일 수행

  • 인터프리터 방식 보완하기 위해 도입된 JIT 컴파일러.

  • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴팡리하여 네이티브 코드로 변경, 이후에는 네이티브 코드로 직접실행.

    네이티브코드는 캐시에 보관하기 때문에 한번 컴파일된 코드는 빠르게 수행.

Runtime Data Area란?

  • 프로그램을 수행하기 위해 OS에서 할당 받은 메모리공간.

Runtime Data Area - PC Register

  • Thread(쓰레드)가 시작될 떄 생성되며, 쓰레드마다 하나씩 존재.

  • 쓰레드가 어떤 부분을 어떤 명령으로 실행해야할지 기록하는 부분.

    	  현재수행중인 JVM명령의 주소를 갖는다.

Runtime Data Area - JVM Stack Area(스택영역)

  • 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터 저장영역.

Runtime Data Area - Native Method Stack

  • 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.

    	  일반프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행.

Runtime Data Area - Method Area

  • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 메모리 공간.

  • Runtime Constant Pool이라는 별도의 관리영역도 함께 존재.

    	  Runtime Constant Pool: 상수 자료형을 저장하여 참조하고 중복을 막는 역할
  • 올라가는 정보의 종류

    종류설명
    Field Infomation멤버변수의 이름, 데이터타입, 접근제어자에 대한 정보.
    Method Infomation메소드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보.
    Type Infomationclass/interface 여부 저장. 타입속성, 전체이름, super class의 전체이름
    (단, interface이거나 object인 경우 제외)

Runtime Data Area - Heap(힙 영역)

  • 객체를 저장하는 가상 메모리 공간.
    • permanent Generation: 생성된 주소값이 저장된 공간.

    • New / Young: Eden(객체들이 최초로 생성되는 공간), Survivor 0/1(Eden에서 참조되는 객체들이 저장되는 공간)

    • Old 영역: 일정시간 참조되고 있는 객체들이 저장되는 공간.

        Eden영역에 객체가 가득차게 되면 첫번째 GC발생. 
        Eden영역값을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제.

GC(Garbage Collection) 이란?

  • Heap(힙 영역)에서 사용하지 않는 객체(인스턴스)들을 제거하는 작업

  • 필요한 이유는 java는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기에 객체를 사용하고 제거하는 기능이 필요하기 때문.

    	   'stop-the-world': GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것.

GC - New/Young Generation

  • 새롭게 생성된 객체의 대부분 위치. 금방 접근불가 상태로 됨.
  • 이 영역에서 개체가 사라질 때, Minor GC 발생 한다고 함.

GC - Old Generation

  • 접근 불가능 상태로 되지 않아 Young영역에서 살아남은 객체가 여기로 복사됨.
  • 이 영역에서 개체가 사라질 때, Major GC(Full GC) 발생 한다고 함.

GC - 어떤 원리로 소멸시킬 대상을 선정하는가?

  • 힙 내의 객체 중에서 가비지(참조되고 있지 않은 객체)를 찾아내고 처리해서 힙의 메모리 회수.
  • 가비지인지 아닌지 판단하기 위해서 reachability라는 개념사용.
  • 어떤 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability, 없다면 unreachability
  • 참조 사슬 형성. 최초에 참조한 것을 Root Set.
    • heap내의 다른 객체에 의한 참조
    • java스택(메서트 실행시에 사용하는 지역변수와 파라미터들에의한 참조) [Root Set]
    • 네이티브스택(Java Native Interface에 의해 생성된 객체에 대한 참조) [Root Set]
    • 메서드 영역의 정적 변수에 의한 참조 [Root Set]

GC - Old영역 - Serial GC

  • mark-sweep-compact 알고리즘, GC를 처리하는 스레드가 하나.
  • 적은 메모리와 cpu 코어 개수가 적을 때 적합.

GC - Old영역 - Parallel GC(Throughput GC)

  • 기본적인 알고리즘은 Serial GC와 같다. GC를 처리하는 쓰레드가 여러 개.
  • 메모리가 충분하고 코어의 개수가 많을 때 유리

GC - Old영역 - Parallel Old GC

  • Mark-Summary-Compaction 알고리즘
  • 별도로 살아 있는 객체를 식별한다는 점에서 약간 더 복잡한 단계를 거침.

GC - Old영역 - CMS GC(Low Latency GC)

  • stop-the-world 시간이 매우 짧다. 모든 애플리케이션의 응답 속도가 매우 중요할때 적합.
  • 단점
    • 다른 GC 방식보다 메모리와 CPU를 더 많이 사용
    • Compaction 단계가 기본적으로 제공되지 않는다.

GC - Old영역 - G1 GC

  • 장기적으로 말도 많고 탈도 많은 CMS GC를 대체.
  • 어떤 GC 방식보다도 빠르다.


참고 - Interview_Question_for_Beginner

profile
일단 해보자 뭐든 되겠지 😄

0개의 댓글