Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3주차 모의 면접 질문 정리 (Java 4~12) #13

Open
kyeong-hyeok opened this issue Jan 25, 2024 · 0 comments
Open

3주차 모의 면접 질문 정리 (Java 4~12) #13

kyeong-hyeok opened this issue Jan 25, 2024 · 0 comments
Assignees
Labels

Comments

@kyeong-hyeok
Copy link
Contributor

Minor Garbage Collection과 Major Garbage Collection의 동작 방식에 대해 설명해 주세요.

Minor GC

  1. Eden 영역이 가득 찬 후 실행
  2. Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사, Eden 영역을 비움
  3. Survivor 영역도 가득차면 같은 방식으로 다른 Survivor 영역에 복사하고 비움
  4. 이를 반복하다 보면 계속해서 살아남는 객체는 old 영역으로 이동

Major GC

  1. Old 영역은 데이터가 가득 차면 GC를 실행
  2. 삭제되어야 하는 객체를 mark하고 지움 (sweep)
  3. 메모리는 단편화된 상태이므로 이를 한 군데에 모아주는 것을 Compaction이라 하며 compact라함 (Mark-Sweep-Compact 알고리즘)

추가 질문: JVM의 heap 영역 중 young영역에서 survivor부분이 survivor0과 survivor1로 나뉘어져있는 이유

  • 대부분의 객체가 금방 소멸되거나 유지되는 짧은 생존 주기를 가지는데, 이러한 객체들을 효율적으로 관리하기 위해 Young 영역을 나누어 사용
  • 새로운 객체는 Eden 영역에 할당되며, GC 과정에서 Eden 영역에서 살아남은 객체들은 Survivor 영역 중 하나로 이동 (한 번의 GC 주기 동안 한 Survivor 영역은 비워져 있어야 함) → 다음 GC 주기에서는 다른 Survivor 영역으로 이동

JVM, JRE, JDK를 설명해주세요.

  • JVM은 Java 코드를 실행하기 위한 가상머신입니다.
  • 기기나 운영체제에 상관없이 실행하도록 합니다. 그리고 GC를 활용해서 메모리를 효율적으로 관리합니다.
  • Java Runtime Environment는 말그대로 구동하기 위한 필수 클래스 라이브러리를 지원합니다.
  • 클래스 라이브러리와 클래스 로더가 필요합니다. 하지만 JVM에 올려두는 일까지만하고 코드를 분석하거나 클래스로 변환하는 작업 못합니다.
    -Java Development Kit이 Java로 이루어진 코드를 클래스 파일로 컴파일을 해줍니다. 또한 디버깅 기능도 도와줍니다. 자바 코드로 개발하기 위한 기능은 모두 JDK에 포함되어 있다고 볼 수 있습니다.

자바의 예외처리 방법에 대해 설명해 주세요.

  • 예외가 발생한 메소드 내에서 직접 처리하는 방법
    • try-catch-finally
  • 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법
    • throws
  • 사용자 정의 예외를 생성하여 처리하는 방법이 있다.
    • throw

CheckedException과 UnCheckedException의 차이에 대해 설명해 주세요.

자바가 제공하는 예외 계층 구조

  • CheckedException
    • 실행 전에 예측 가능한 예외. 복구 가능한 예외이기에 예외처리 코드 필수
    • catch, throws
    • RuntimeException 상속하지 않음
    • Checked Exception 을 처리하기 위해서는 throws 를 이용해 피호출 메소드에서 호출하는 메소드로 예외를 던진다고 할 수 있음.
      • 하지만 이렇게 무분별하게 throws를 사용하면 가독성을 떨어뜨리고 예외 발생 원인을 알기 어려움.

      • 이 경우 try 문에서 발생하는 Checked Exception 을 catch 문 안에서 Unchecked Exception 으로 바꿔주어 예외가 발생한 메소드에서 예외를 처리할 수 있음

        public static String unCheckedTest(BufferedReader bufferedReader) {
            try {
            	String requestLine = bufferedReader.readLine();
                if (requestLine == null) {
                    throw new UncheckedException("request line이 없습니다.");
            	}
        
              return requestLine;
            } catch (IOException e) {
                throw new UncheckedException("입력 값이 잘못되어 RequestLine 객체를 생성할 수 없습니다.");
            }
        }
  • UncheckedException
    • 실행하고 난 후 알 수 있는 예외. 명시적으로 예외처리를 강제하지 않음
    • NullPointerException,ArrayIndexOutOfBoundException
    • RuntimeException 상속

new String()과 리터럴("")의 차이에 대해 설명해주세요.

  • new로 객체가 생성이 되면 해당 객체는 Heap 영역에 값이 위치하게 됩니다. 보통 객체가 생성되는 원리와 유사합니다.
  • 문자열 리터럴을 이용하여 생성하는 방식입니다. 리터럴을 String 레퍼런스에 바로 넣어줍니다. String Constant Pool 이라는 공간에 값이 생성됩니다. 명칭 그대로 문자열들을 저장해놓은 Pool

GC에서 발생하는 오버헤드는 무엇인가요?

  • 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 Stop-The-World가 발생
  • GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상
  • GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있음

추가 질문: Stop-The-World를 줄일 수 있는 방법? -> G1 GC

  • Heap Memory 전체를 탐색하는 것이 아닌 영역(region)을 나눠 탐색하고 영역(region)별로 GC
  • 현재 GC 중 Stop The World의 시간이 제일 짧음
  • Heap을 Region이라는 일정한 부분으로 동적으로 나눠서 메모리 관리

Call By Value, Call By Reference가 무엇인가요?

  • Call By Value는 메서드를 호출할 때 값을 전달하고 Call By Reference는 주소를 전달합니다.
  • Call By Value는 복사된 변수를 전달하기 때문에 수정을 해도 원본에 영향을 주지 않습니다.
  • Call By Reference는 원본과 동일한 주소를 전달하기 때문에 수정하면 영향을 줍니다.

추가 질문: Java는 어떤 방식으로 동작하나요?

  • Java 같은 경우는 변수에 할당된 값의 주소 ‘값’을 복사해서 전달합니다.
  • 주소를 전달해서 Call By Reference처럼 보일 수도 있지만 값을 복사해서 전달하기 때문에 Call By Value로만 동작합니다.

Auto Boxing & Unboxing에 대해 설명해 주세요.

  • JDK 1.5부터 자바 컴파일러가 Boxing 과 Unboxing 이 필요한 상황에 자동으로 처리해준다.
// Auto Boxing
int i = 10;
Integer num = i;

// Auto Unboxing
Integer num = new Integer(10);
int i = num;
  • Integer 객체가 아닌 원시 값 int를 추가해도 컴파일 시 에러가 나지 않는다.
  • Auto Boxing&Unboxing 이 제공되고 있지만, 컴파일러 내부적으로 추가 연산 작업을 거치게 된다. 성능 향상을 위해 Auto Boxing&Unboxing 이 일어나지 않도록 동일한 타입 연산이 이루어지도록 구현하는 것이 좋다. (100만건 기준으로 약 5배 성능 차이가 난다.)

Java 비동기 처리 방식에 대해 설명해 주세요.

Non-Blocking processing model로 병렬적으로 task를 수행

  • Callback - CompletionHandler를 사용할 수도 있고, 함수형 인터페이스를 이용해서 구현 가능
    • CompletionHandler - completed() 메소드를 오버라이드해서 콜백을 구현하고, failed() 메소드를 오버라이드해 작업이 실패했을 때의 처리를 구현
    • 함수형 인터페이스 - 작업1을 마친 뒤 callback으로 받아온 함수형 인터페이스를 실행하는 메소드를 호출
  • Future - Future 객체를 사용한 비동기 처리 방식은 다른 주체에게 작업을 맡긴 상태에서 본 주체 쪽에서 작업이 끝났는지 물어보면서 직접 확인하는 방식

Java에서 String이 Immutable한 것의 장점에 대해 설명해 주세요.

  • String이 불변하다면 다른 객체들과 공유하는 과정에서 캐싱으로 성능적인 이득을 취할 수 있고, 멀티 쓰레드 환경에서 동기화 문제가 발생하지 않아 안전한 결과를 냄. Mutable 하다면 일관성있는 데이터가 아니게 될 수 있음

Exception 발생은 컴파일 과정에서 일어나나요 실행 과정에서 일어나나요?

  • 두 예외 모두 런타임 시점에 발생하지만, CheckedException의 경우 컴파일러가 예외처리를 확인 하는 과정에서 코드가 실행되지 않기 때문에 컴파일 환경에서 발생하는 것으로 보이는 것이다.

xms, xmx가 무엇이고 배포 환경에서 xms와 xmx를 동일하게 설정하는 이유가 뭘까요?

  • xms은 힙의 최초 크기, xmx는 힙의 최대 크기를 지정하는 것이다.
  • 최초 크기를 작게하면 GC가 자주 발생하고, 최초 크기에 가까워졌을 때 OS에 추가 메모리를 요구한다.
  • 이 부분에서 추가적인 시간과 성능이 필요하기 때문에 처음부터 최대로 설정하여 이런 상황을 없애는 것이다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants