250x250
Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- JPA
- deque
- union_find
- javascript
- Java
- set
- html
- List
- 리소스모니터링
- 스프링부트
- NIO
- GC로그수집
- Properties
- date
- map
- math
- 힙덤프
- 큐
- Union-find
- dfs
- CSS
- sql
- alter
- BFS
- scanner
- string
- 스택
- priority_queue
- spring boot
- Calendar
Archives
- Today
- Total
매일 조금씩
Java 개념 정리 (5) - JVM, GC 본문
728x90
반응형
JVM & GC
- JVM 구조에 대해서 설명해 주세요.
- JVM은 크게 클래스 로더, 런타임 데이터 영역, 실행 엔진으로 나눌 수 있습니다.
- 클래스 로더에 대해 설명해 주세요.
- 클래스 로더는 런타임 동안 JVM의 메소드 영역에 동적으로 Java 클래스를 로드하는 역할을 합니다. 클래스 로더는 로딩, 링크, 초기화 단계로 나뉘어져 있습니다.
- 로딩은 자바 바이트 코드를 메소드 영역에 저장합니다.
- 링크는 읽어온 클래스가 문제가 없는지 검사하고, 클래스가 필요한 메모리를 할당하고, 심볼릭 메모리 레퍼런스를 실제 레퍼런스로 교체합니다.
- 초기화는 클래스를 적절한 값으로 초기화하며, static 필드들이 설정된 값으로 초기화됩니다.
- JVM 메모리 구조를 자세히 설명해 주세요.
- JVM 메모리 구조는 크게 스택, 힙, 메서드 영역으로 나눌 수 있습니다. 스택은 메서드 호출 시마다 각각의 스택 프레임이 생성됩니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
- 힙은 프로그램을 실행하면서 생성된 인스턴스를 저장하는 공간입니다.
- 메서드 영역은 클래스 로더가 클래스 파일을 읽어오면, 클래스 정보를 파싱하여 필드와 메소드 정보, 메소드의 바이트 코드 등을 저장하는 공간입니다.
- GC란 무엇인가요?
- GC는 메모리 관리 기법 중 하나로, 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역을 해제하는 기능입니다. 여기서 동적으로 할당했던 메모리 영역은 프로그램 런타임에 사용되는 Heap 영역 메모리를 뜻하고, 필요 없게 된 영역은 어떤 변수도 가리키지 않게 된 영역을 뜻합니다.
- GC의 장단점을 설명해 주세요.
- 메모리를 수동으로 관리하던 것에서 비롯된 에러를 예방할 수 있다는 장점이 있습니다. 반면, GC의 메모리 해제 타이밍을 정확히 알기 어렵고, 어떠한 메모리 영역이 해제의 대상이 될 지 검사하고 실제로 해제하는 일이 모두 오버헤드에 해당한다는 단점이 있습니다.
- GC를 모니터링해야 하는 이유가 무엇일까요?
- Minor GC는 빠르게 처리되기 때문에 크게 영향을 끼치지 않지만, Major GC는 처리하는데 시간이 오래 걸려서 장애를 초래할 수 있기 때문입니다. 따라서 GC 모니터링을 통해 Major GC를 사전에 예방하는 것이 중요하다고 생각합니다.
- 자바로 jvm 응용 프로그램을 개발한 후에 운영하다보면 out of memory가 나올 수 있는데 이 에러가 발생했을때 어떻게 대처할 것 같으세요?
- out of memory가 발생하면 -XX:+HeapDumpOnOutOfMemoryError 명령어를 사용하여 JVM 단에서 자동으로 Heap Dump를 뜨도록 설정한 뒤, Heap Dump 분석 툴을 사용하여 Heap 메모리를 분석할 것입니다.
- 메모리 누수를 어떻게 확인할 것인가요?
- VisualVM과 같은 모니터링 툴을 사용하여 메모리 사용률을 체크하고, 일정 수치가 넘어가면 알림이 오도록 설정할 것 같습니다. 그리고 알림이 왔을 경우, 해당 시점에 Heap Dump를 떠서 Heap Dump를 분석할 것입니다.
JVM & GC 심화
- GC에서 사용하는 알고리즘은 무엇이 있고, Java는 어떤 알고리즘을 사용하나요?
- GC에서 사용하는 알고리즘은 Reference Counting과 Mark And Sweep가 있고, Java에서는 후자를 선택하여 사용합니다.
- Reference Counting은 각각의 객체는 몇 가지 방법으로 해당 객체에 접근할 수 있는지 나타내는 Reference Count를 가지고 있고, 이 Count가 0이 된 객체를 메모리에서 해제하는 기법입니다. 서로가 서로를 참조하는 순환 참조가 발생하면 메모리 누수가 발생할 수 있습니다.
- Mark And Sweep은 Root Space(스택 변수, 정적 변수 등 Heap 영역 참조를 가리키는 공간)부터 그래프 순회를 통해 연결된 객체를 찾아내고, 연결이 끊어진 객체는 메모리에서 해제하는 기법입니다. Mark And Sweep은 의도적으로 특정 순간에 GC를 실행해야 합니다.
- Java 8 기준으로, GC는 어떤 방식으로 수행되나요?
- JVM의 Heap은 Young Generation, Old Generation으로 나뉘고, Young Generation은 다시 Eden, Servival 0, Servival 1 영역으로 나뉩니다. Eden 영역이 꽉 차면 Minor GC가 실행되어 Mark And Sweep 알고리즘을 통해 참조가 되고 있는 객체만 Servival 0 또는 Servival 1 영역으로 옮깁니다.
- 만약 여러 번 Minor GC를 실행하고도 참조된 객체가 있다면, 이 객체를 Servival 영역에서 Old Generation으로 옮깁니다. 시간이 지나서 Old Generation 영역이 꽉 차면 Major GC를 실행하여 Mark And Sweep 알고리즘을 통해 필요 없는 메모리를 비웁니다.
- 왜 Heap 영역은 Young Generation과 Old Generation으로 나뉘나요?
- 통계적으로 대부분의 객체가 수명이 짧으므로 특정 부분만 탐색함으로써 GC의 성능을 높이기 위해 나누었습니다.
- GC의 실행 방식을 아는만큼 설명해 주세요.
- Serial GC
- Serial GC는 하나의 스레드로 GC를 실행하는 방식인데, 하나의 스레드로 GC를 실행하다 보니 Stop The World 시간이 깁니다.
- GC 실행 이후 메모리 파편화를 막는 Compaction 과정을 수행합니다.
- Parallel GC
- Serial GC를 멀티 스레딩으로 수행합니다.
- CMS GC
- 대부분의 가비지 수집 작업을 애플리케이션 스레드와 동시에 수행하여, Stop The World 시간을 최소화하고 있습니다. 하지만 메모리와 CPU를 많이 사용하고, Mark And Sweep 과정 이후 메모리 파편화를 해결하는 Compaction이 기본적으로 제공되지 않는다는 단점이 있습니다.
- G1 GC
- 전통적인 Heap 구조와 달리, G1 GC에서는 Region이라는 논리적 단위로 Young Genetarion, Old Generation 등으로 쪼개져 있습니다. CMS GC보다 나은 방식으로 애플리케이션과 GC를 동시에 실행할 수 있고, 메모리 Compaction 과정까지 지원하고 있습니다.
- Serial GC
- Java 8과 Java 11의 디폴트 GC 실행 방식은 어떤 것인가요?
- Java 8은 Parallel GC이고, Java 11은 G1 GC입니다.
- G1 GC에 대해 설명해 주세요.
- G1 GC에서 G1은 Garbage First의 약어이며, Garbage만 존재하는 Region을 먼저 회수한다고 해서 붙여진 이름으로, 빈 공간 확보를 빠르게 수행하는 GC입니다.
- G1 GC의 Heap 구조를 설명해 주세요.
- 전통적인 힙 구조는 Young, Old 영역을 명확하게 구분하였지만, G1 GC는 개념적으로 그들이 존재하나 일정 크기의 논리적 단위인 region으로 구분하고 있습니다. G1 GC에서는 이 외의 크기가 큰 객체를 저장하는 Humonogous 영역, 아직 사용되지 않은 공간인 Available 영역이 존재합니다.
- 왜 Java 11은 디폴트 GC를 G1 GC로 변경하였을까요?
- G1 GC는 힙을 고정된 크기의 영역으로 나누고 각 영역을 독립적으로 청소합니다. 이를 통해 특정 영역만을 선택적으로 수집할 수 있어 전체 힙을 멈추고 GC할 필요를 줄입니다. 이 방식은 특히 힙 메모리가 클수록 효율적으로 관리할 수 있는데, 많은 기업들이 대규모 힙 메모리를 사용하는 애플리케이션을 운영하면서 G1 GC의 사용이 더욱 적합해졌습니다. 특히, 짧고 예측 가능한 정지 시간이 중요한 금융 거래 시스템이나 실시간 데이터 처리 애플리케이션에서는 G1 GC의 장점이 더욱 부각됩니다.
728x90
반응형
'Java' 카테고리의 다른 글
Java 개념 정리 (4) - 동시성 프로그래밍 (0) | 2025.02.16 |
---|---|
Java 개념 정리 (3) - 컬렉션, 스레드 (0) | 2025.02.16 |
Java 개념 정리 (2) - 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.09 |
Java 개념 정리 (1) - Java 기본, 객체 지향 (0) | 2025.01.09 |
Servlet 이란? Spring 에선 어떻게 사용하고 구현되는지? (0) | 2024.11.03 |