728x90
질문들은 여기서 참고했어요
https://github.com/KimHunJin/Study-Book/tree/master/interview
- JVM구조에 대해 설명하시오.
- JVM이란 JAVA 컴파일러를 통해 JAVA source code(.java)에서 바이트 코드(.class)로 변환된것을 실행 할 수 있는 주체를 말합니다.
- JVM은 크게 Class Loader, Runtime Data Area, Executtion engine 세가지로 나뉩니다
첫번째로 Class Loader는 JAVA 컴파일러를 통해 생성된 바이트 코드들을 엮어서 JVM이 운영체제로 부터 할당받은 메모리 영역인 Runtime Data Area로 적제하는 역할을 합니다. - 두번째로 Runtime Data Area는 자바 애플리케이션을 실행할 때 사용되는 데이터들 을 적제하는 영역입니다.
크게 Method Area, Heap Area, Stack Area, PC register, Native Method Area 로 나눌 수 있습니다. 이때 Method Area와 Heap Area는 모든 쓰레드가 공유하는 영역입니다.- Method Area 는 클래스의 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드 정보, 타입 정보, Constant Poll(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static변수 final class변수등이 생성되는 영역입니다.
- Heap Area 는 인스턴스(New 키워드로 생성된 객체)와 배열이 생성되는 영역입니다.
메소드 영역에 로드된 클래스만 생성이 가능하고 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다. - Stack Area는 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시 값등이 생성되는 영역입니다.
만약 Person p = new Person(); 이라는 소스를 작성했다면 Person p 는 Stack Area에 생성이 되고 new로 생성된 Person클래스의 인스턴스는 Heap Area에 생성이 됩니다.
그리고 Stack Area에 생성된 p는 Heap Area의 주소값을 가지고 있다. 즉 p가 Heap Area에 생성된 객체를 참조하고 있는 것이다.
메소드를 호출할 때마다 개별적으로 Stack이 생성된다. - PC Register는 쓰레드가 생성될 때마다 생성되는 영역으로 Program Counter 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.(※CPU의 PC 레지스터와는 다릅니다)
이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 합니다. - Native Method Stack은 종종 자바의 성능 향상을 위해 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
보통 C 와 C++ 등의 코드를 수행하기 위한 스택입니다(JNI)
- 세번째로 Excute engine은 Class Loader에 의해 메모리에 적재된 바이트 코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 합니다.
구성 요소는 크게 Interpreter, JIT, GC 로 나눌 수 있습니다.- Interpreter는 우리가 흔히 하는 인터프리터방식으로 런타임시에 바이트 코드를 한줄 한줄 읽고 해석하는 역할을 합니다.
- JIT(Just-In-Time)은 컴파일러 방식으로 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다
- GC(Garbage Collector)는 Heap 메모리 영역에 생성된 객체들 중에 참조된지 않는 객체들을 탐색 후 제거하는 역할 을 합니다.
GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없습니다.(참조가 없어지자마자 해제되는 것을 보장하지 않음)
또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지됩니다.
특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있습니다.
- GC처리 방법에 대해 설명하시오.
- 자바에서의 GC(Gabage Collection) Jvm의 Runtime Data Area에 존재하는 Heap 영역에서 더 이상 참조되지 않는 쓰레기(Garbage)데이터를 없애는 작업을 말합니다. 이는 Execution engine에 존재하는 Garbage Collector(이하 GC) 가 수행합니다.
- GC를 알기 위해서는 크게 두가지의 개념을 할고 가야합니다. 첫번째는 Reachability, 두번째는 Mark and Sweep 입니다.
- 첫번째인 Reachability 의 개념은 간단합니다. heap 영역에서 객체가 Garbage인지 판단하기 위한 개념으로 만약 유효한 참조가 있다면 Reachable, 없다면 unRechable 로 구별합니다.
- 두번째인 Mark and Sweep은 GC의 핵심 개념으로 Mark와 Sweep 두 과정을 통해 GC를 진행합니다
- 먼저 Mark란?
- GC가 모든 스택의 변수를 스캔하면서 어떤 객체(인스턴스)를 참조하는지 마킹 합니다.
- 위에서 말한 Reachable로 구별된 객체도 마킹합니다.
- 다음으로 Sweep 이란?
- Mark 되지 않거나 unReachable로 구별된 객체들을 Heap에서 제거합니다.
- 먼저 Mark란?
관련 포스트 : Heap 영역과 GC
- HashMap, HashTable, ConcurrenthashMap의 차이를 설명하시오.
- HashMap, HashTable, ConcurrentHashMap 모두 Map 인터페이스를 구현한 컬렉션 입니다. 따라서 모두 <Key, Value>의 구조를 가지고 있지만 Key,Value, 값의 null 허용 여부, 속도,동기화 보장 등이 서로 조금씩 다릅니다.
- HashMap은 Synchronized 키워드가 없기 때문에 data의 Thread-safe를 보장하지 못합니다. 이 때문에 멀티쓰레드 환경에서의 사용은 부적절 하며 싱글 쓰레드 환경에서는 동기화처리를 하지 않기 때문에 값을 찾는 속도가 빠릅니다.
또 HashTable과는 다르게 Key, Value 모두 null 값을 허용 합니다. - 다음으로 HashTable은 Synchronized 키워드가 있어 메서드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해줍니다. 또 Key, Value 모두 null 값을 허용하지 않는다는 특징이 있습니다.
- 마지막으로 ConcurrentHashMap은 HashMap의 멀티쓰레드 환경에서의 Thread-safe를 보장하기 위해 나온 컬렉션입니다. 그러나 HashMap과는 다르게 Key, Value 에 null을 허용하지 않습니다.
- HashMap은 Synchronized 키워드가 없기 때문에 data의 Thread-safe를 보장하지 못합니다. 이 때문에 멀티쓰레드 환경에서의 사용은 부적절 하며 싱글 쓰레드 환경에서는 동기화처리를 하지 않기 때문에 값을 찾는 속도가 빠릅니다.
- HashMap, HashTable, ConcurrentHashMap 모두 Map 인터페이스를 구현한 컬렉션 입니다. 따라서 모두 <Key, Value>의 구조를 가지고 있지만 Key,Value, 값의 null 허용 여부, 속도,동기화 보장 등이 서로 조금씩 다릅니다.
접근제어자에 대해 설명하시오.
- 자바에는 default, private, public, protected 총 4가지의 접근 제어자가 있습니다.
- 첫번째로 default는 별도의 명시 없이 접근제어자가 지정되지 않는다면 default로 인식 됩니다.
default는같은 클래스의 멤버와 같은 패키지에 속하는 멤버만 접근 할 수 있습니다. - 두번째로 private는 정보 은닉을 위해 사용 합니다. private로 선언된 클래스는 외부에 공개되지 않고 직접 접근이 불가능 합니다.
따라서 접근을 하고자 할때는 내부의 public 메서드를 통해서만 접근 할 수있습니다. - 세번째로 public은 해당 객체를 사용한다면 어디서나 직접 접근이 가능한 접근 제어자 입니다. 위에서 말씀드렸듯이 public 메서드를 통해서 private 멤버에 접근이 가능합니다. 따라서 public 메서드는 private 멤버의 인터페이스 역할을 수행한다고 할 수 있습니다.
- 마지막으로 protected는 같은 패키지에 속한 멤버들과 자식클래스에게는 public 처럼 접근이 가능하고 그 외의 외부 패키지에서는 private 처럼 접근이 불가능 하다는 특징이 있습니다.
계속됩니다... 내가 보려고 정리하는 신입 개발자 면접 질문 및 답변 - JAVA#2
reference
https://jeong-pro.tistory.com/148
728x90
'Study > 면접 준비' 카테고리의 다른 글
내가 보려고 정리하는 신입 개발자 면접 질문 및 답변 - JAVA#2 (0) | 2021.05.12 |
---|---|
내가보려고 정리하는 신입 개발자 면접 준비 - JAVA (0) | 2021.05.06 |