delpho
Java에 대하여 - 1 본문
1. JVM의 구조와 Java의 실행방식을 설명해주세요.
# JVM ( Java Virtual Machine )
- 자바와 운영체제 사이에서 중개자 역할을 수행
- 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줌
- 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작
# 자바는 왜 JVM이 필요할까?
- Java 컴파일러는. java 파일을. class 파일로 컴파일한다.
- 이는. java 파일을 Java byte code로 변환하여. class 만드는 것인데 Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행이 되지 않는다.
- 이를 해결하기 위해 JVM을 통해 .class 파일을 로드/해석하여 Java 프로그램을 실행하는 것!
- 즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할
# JVM의 구조
- 크게 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 나뉘어짐
# java 프로그램의 실행 단계
- 먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환됩니다.
- 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것입니다.
2. GC(Garbage Collector)가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.
# Garbage Collection
- Heap 메모리를 재활용 하기 위해 참조 되지 않는 Object(Unreachable Object)들을 해제해 가용한 공간을 만드는 작업
- 실행 조건이 일정하지 않다
# JVM의 Heap
- JVM의 Heap 영역은 처음 설계될 때, 2가지 전제로 설계됨
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
- 즉, 객체는 대부분 일회성이고, 메모리에 오래 남아있는 경우는 드물다!
- --> 객체의 생존기간을 기준으로 물리적인 Heap 영역을 나누게 됨 (Young, Old)
- 초기에는 Perm 영역도 존재했지만, Java8에서 제거
- --> 객체의 생존기간을 기준으로 물리적인 Heap 영역을 나누게 됨 (Young, Old)
- Young 영역
- 1개의 Eden 영역 + 2개의 Survivor 영역으로 나뉘어짐
- Eden 영역: 새로 생성된 객체가 할당(Allocation)되는 영역
- Survivor 영역: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
- 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에, 많은 객체가 이 영역에서 생성되었다가 사라짐
- Minor GC = Young 영역에 대한 가비지 컬렉션(Garbage Collection)
- 1개의 Eden 영역 + 2개의 Survivor 영역으로 나뉘어짐
2. Old 영역
- Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
- 수명 짧은 객체들은 보통 큰 공간을 필요로 하지 않음
- 큰 객체들은 Young 영역이 아닌 Old 영역에 할당됨
- Major GC 또는 Full GC = Old 영역에 대한 가비지 컬렉션(Garbage Collection)
3. Card Table 영역
- 예외적인 상황으로 Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우도 존재할 것
- 이러한 경우를 대비하여 Old 영역에는 512 bytes의 덩어리(Chunk)로 되어 있는 카드 테이블(Card Table)이 존재
- Old 영역에 있는 객체가 Young 영역의 객체를 참조할때 마다 그에 대한 정보가 표시됨
- 도입된 이유
- Young 영역에서 가비지 컬렉션(Minor GC)가 실행될 때 모든 Old 영역에 존재하는 객체를 검사하여 참조되지 않는 Young 영역의 객체를 식별하는 것이 비효율적이기 때문!
- 그렇기 때문에 Young 영역에서 가비지 컬렉션이 진행될 때 카드 테이블만 조회하여 GC의 대상인지 식별할 수 있도록 하고 있다.
# Garbage Collection의 동작 방식
- Young 영역과 Old 영역은 다른 메모리 구조로 되어있기때문에 세부적인 방식은 다르다.
- 하지만, 기본적으로 GC가 실행된다고하면 아래 2가지의 공통 단계를 따르게 됨!!
- Stop The World
- 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
- GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개
- Mark and Sweep
- Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별!
- Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
- Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
# 영역 별 동작 방식
- Minor GC의 동작방식
- 새로 생성된 객체가 Eden 영역에 할당
- Eden 영역이 꽉차게 되면 Minor GC가 실행
- Eden 영역에서 사용되지 않는 객체의 메모리가 해제된다.
- Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동된다.
- 1~2번의 과정이 반복되다가 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.(1개의 Survivor 영역은 반드시 빈 상태가 된다.)
- Survivor 영역 중 1개는 반드시 사용이 되어야 한다.
- 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 모두 사용량이 0이라면 현재 시스템이 정상적인 상황이 아님을 파악할 수 있다.
- 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동(Promotion)된다.
- 객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록
- Minor GC 때 Object Header에 기록된 age를 보고 Promotion 여부를 결정한다.
- Major GC의 동작 방식
- Young 영역에서 오래 살아남은 객체는 Old 영역으로 Promotion됨
- 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 Major GC 발생
- Young 영역은 일반적으로 Old 영역보다 크키가 작기 때문에 GC가 보통 0.5초에서 1초 사이에 끝난다.
- 그렇기 때문에 Minor GC는 애플리케이션에 크게 영향을 주지 않는다.
- 하지만 Old 영역은 Young 영역보다 크며 Young 영역을 참조할 수도 있다.
- 그렇기 때문에 Major GC는 일반적으로 Minor GC보다 시간이 오래걸리며, 10배 이상의 시간을 사용한다.
3. 제네릭에 대해서 설명해주세요.
# 제네릭
- 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 데이터 타입이 지정되는 것을 의미
- 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것
# 제네릭 장점
- 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
- 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
# 제네릭 사용방법
# 상황별 선언 및 생성 방법
- 제네릭 클래스 및 인터페이스 선언
public Interface InterfaceName <T> { ... }
public class HashMap <K, V> { ... }
public class ClassName <T> { ... }
public class Student { ... }
public class Main {
public static void main(String[] args) {
ClassName<Student> a = new ClassName<Student>();
}
}
// 제네릭 클래스
class ClassName<K, V> {
private K first; // K 타입(제네릭)
private V second; // V 타입(제네릭)
void set(K first, V second) {
this.first = first;
this.second = second;
}
K getFirst() {
return first;
}
V getSecond() {
return second;
}
}
- 제네릭 프로그래밍 = 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것
- T 타입은 해당 블럭 { ... } 안에서까지 유효
- 주의해야할 점!!
- 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다!!
- 즉, int, double, char 같은 primitive type은 올 수 없다는 것이다. 그래서 int형 double형 등 primitive Type의 경우 Integer, Double 같은 Wrapper Type으로 쓰는 이유가 바로 위와같은 이유
- 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다!!
2. 제네릭 메소드
public <T> T genericMethod(T o) { // 제네릭 메소드
...
}
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
// 텍스트
}
// 제네릭 클래스
class ClassName<E> {
private E element; // 제네릭 타입 변수
void set(E element) { // 제네릭 파라미터 메소드
this.element = element;
}
E get() { // 제네릭 타입 반환 메소드
return element;
}
<T> T genericMethod(T o) { // 제네릭 메소드
return o;
}
}
- 별도로 메소드에 한정한 제네릭도 사용할 수 있다.
- 클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다.
4. 어노테이션에 대해서 설명해주세요.
# 어노테이션의 의미
- 사전적 의미 = 주석
- 자바에서의 의미 = 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술
- 프로그램에게 추가적인 정보를 제공해주는 메타데이터(데이터를 위한 데이터)
# 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 런타임 시 특정 기능을 실행하도록 정보를 제공
# 어노테이션 종류
- 내장 어노테이션
- 메타 어노테이션 (어노테이션에 적용되는 어노테이션)
# 어노테이션 사용 순서
- 어노테이션 정의 -- 필요 시
- 클래스에 어노테이션 배치
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능 실시
# 어노테이션 정의
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
public 타입 elementName() [default 값]
...
}
- 정의할 때 설정해야 할 부분!!
- 어노테이션이 어디에 적용되는지 --- @Target
- 어노테이션 소스가 언제까지 유지될 것인지 --- @Retention
- @Target
- 어떠한 값, 범위(ex : 클래스, 필드, 메서드 ...)에 어노테이션을 적용할 것인지.
ElementType.TYPE : 클래스, 인터페이스, enum
ElementType.FIELD : 필드
ElementType.METHOD : 메서드
ElementType.PARAMETER : 파라미터
ElementType.CONSTRUCTOR : 생성자
ElementType.LOCAL_VARIABLE : 지역 변수
ElementType.ANNOTATION_TYPE : 어노테이션
ElementType.PACKAGE : 패키지
ElementType.TYPE : 클래스, 인터페이스, enum
ElementType.TYPE_PARAMETER : 타입 파라미터
ElementType.TYPE_USE : 타입
ElementType.MODULE : 모듈
- @Retention
- 어노테이션 값들을 언제까지 유지할 것인지 값을 입력.
RetentionPolicy.RUNTIME : 런타임
바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임에 어노테이션 정보를 얻을 수 있다.
RetentionPolicy.CLASS : 컴파일
바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다.
RetentionPolicy.SOURCE : 컴파일 전 소스레벨
소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
# 어노테이션의 배치 및 사용
5. 오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요?
# 오버라이딩
- 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
- 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
- 접근 제어자만 다르게한다고 오버로딩이 가능하지 않다
# 오버로딩
- 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것
- 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다
출처
https://technote-mezza.tistory.com/72
[JVM구조]JVM으로 보는 java 프로그램의 실행 과정
java를 통해 개발을 하면서 jvm위에서 돌아간다는 것쯤은 알고 있을 것이다. 하지만 프로그램이 실행되고 처리되는 과정에 대해 정리가 되지 않았던 것 같아 정리하면서 여러 가지 궁금점을 포함
technote-mezza.tistory.com
https://mangkyu.tistory.com/118
[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)
1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는..
mangkyu.tistory.com
https://velog.io/@recordsbeat/Garbage-Collector-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B8%B0
Garbage Collector 제대로 알기
ㅅㅅ슈규슈슉 g..gc 슈슉 g...gc GC! 슈슉
velog.io
https://st-lab.tistory.com/153
자바 [JAVA] - 제네릭(Generic)의 이해
정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고
st-lab.tistory.com
https://honeyinfo7.tistory.com/56
Java에서 어노테이션(Annotation) 이란 무엇인가에 대해 알아보자.
자바에서 어노테이션이라는 기술이 스프링 프레임워크상에서 자주 쓰이지만 이 기술에 대해 자세히 알아보지도 않고 IT에 몸담고 있는 5년간 대충 아는정도에 밖에 그치지 못하고 있다. 이러
honeyinfo7.tistory.com
https://hyoje420.tistory.com/14
[Java]오버로딩 & 오버라이딩(Overloading & Overriding)
오버로딩(Overloading) 오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것
hyoje420.tistory.com
'CS' 카테고리의 다른 글
Java에 대하여 - 3 (0) | 2022.06.10 |
---|---|
Java에 대하여 - 2 (0) | 2022.06.08 |
Spring에 대하여 - 3 (0) | 2022.06.04 |
Spring에 대하여 - 2 (0) | 2022.06.03 |
Spring에 대하여 - 1 (0) | 2022.06.02 |