📝 java8의 기본 GC가 무엇인지, 그리고 그 이외에 다른 GC에 대해서
GC (Garbage Collecton) 란? 더이상 사용하지 않는 객체 등을 메모리에서 해제(삭제)하는 JVM의 작업
Java 7, 8은 기본 GC로 Parallel GC를 사용하고, Java 9, 10 은 G1 GC를 사용한다고 한다.
Serial GC
순차적인 GC 라는 의미로, Mark-Sweep-Compaction 알고리즘이 한 번에 하나씩만 동작한다. 가장 오래된 GC이며, 요즘에는 사용되지 않고, 사용해서도 안된다. Stop-The-World 시간이 너무 길기 때문이다.
Parallel GC
Serial GC가 하나의 스레드로 Mark-Sweep-Compaction을 수행한다면, Parallel GC는 여러 개의 스레드로 Mark-Sweep-Compaction을 수행한다. 이로 인해 Stop-The-World 시간이 줄어들게 된다.
Parallel Old GC
Parallel GC와 비슷하나, Mark-Sweep-Compaction 알고리즘 대신 Mark-Summary-Compaction 알고리즘을 사용한다. Summary 작업은 Sweep 작업에 살아있는 객체를 식별하는 작업이 추가된 것이다.
CMS GC
앞의 GC 방식보다 더 개선되었으면서, 복잡한 방식이다. Stop-The-World 시간을 최소화 하는데 초첨을 맞췄다. 컨셉은 GC 대상 객체를 최대한 자세히 파악한 후, Stop-The-World 가 발생하는 Sweep 시간을 최소화 하는데 초점을 맞췄다. Low Latency GC라고도 부른다.
'
'
'
위에 기재한 GC외에도 많은 GC들이 있지만 양이 너무 방대하니,, 추후 따로 게시글을 작성하고 링크를 걸도록 하겠다..
출처
https://velog.io/@hygoogi/%EC%9E%90%EB%B0%94-GC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
📝멀티 프로세스와 멀티 쓰레드의 context switching
멀티 프로세스와 멀티 스레드의 context switching에 대해 설명하기 전 간단하게 용어들의 개념을 짚고 넘어가자.
- 프로세스란? 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다. 누군가가 작성한 프로그램이 메모리를 할당받아 실행하면 프로세스가 된다.
- 쓰레드란? 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
- 하나의 CPU는 동시에 하나의 프로세스만 처리할 수 있다.
- 하나의 CPU에 여러 개의 프로세스를 실행해야 할 때는 각 프로세스를 적절한 시간으로 쪼개서 번갈아 처리한다.
- 이 때 CPU상에서 동작하는 프로세스가 바뀔 때 Context swiching(문맥교환) 이 발생한다.
- Context Switching(문맥교환) 은 현재 진행하고 있는 Task의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말한다.
Context Switching은 어떻게 진행될까?
모든 프로세스는 고유의 PCB(Process Control Block) (TCB(Task Control Block)라고도 함) 를 가지며 PCB는 프로세스의 상태, CPU 레지스터의 값, 메모리 관리 정보 등을 포함하고 있는 자료 구조이다. Context Switching이 발생하면 현재 진행중인 Task를 PCB에 저장, 다음에 실행할 Task의 정보를 PCB에서 읽어와서 실행한다.
자, 간략하게 기본적인 개념에 대해서 설명했으니 이제 멀티 프로세스와 멀티 쓰레드의 Context Switching에 대해서 알아보자.
프로그램이 메모리를 사용하는 방식은 다음과 같이 이루어져 있다.
프로그램은 코드 실행 영역과 데이터 저장 영역으로 나뉘고, 데이터 저장 영역은 또 static, stack, heap 영역으로 나뉜다.
멀티 프로세스 말 그대로 프로세스가 여러개인 것을 말한다. 위에서 프로세스는 메모리를 할당받은 프로그램이라고 말했다. 그리고 바로 위의 사진은 프로그램이 메모리를 사용하는 방식을 나타내는 사진이므로 위의 사진은 프로세스의 메모리 사진이라고 봐도 무방하다는 이야기이다. 멀티 프로세스는 위의 사진과 같은 메모리 구조를 가진 프로세스가 여러 개 있는 것으로 멀티프로세스의 메모리 구조는 다음과 같다.
위 사진처럼 멀티 프로세스는 각 프로세스마다 고유의 메모리가 있고, 고유의 공간이므로 서로 침범할 수 없다. 때문에 멀티 프로세스 환경에서 Context Switching이 발생할 때 PCB에 저장하는 Task(프로세스) 정보는 프로세스의 고유 메모리 전부를 저장한다. 그리고 다음으로 실행될 Task(프로세스)의 정보를 전부 읽어와야 한다.
멀티 쓰레드는 하나의 프로세스 내에서 다수의 실행 단위로 구분하여 스태틱 영역과 힙 영역은 공유하고 스택 영역만 쓰레드의 개수만큼 분할해서 사용한다. 멀티 쓰레드의 메모리 구조는 다음과 같다.
하나의 프로세스 안에서 스태틱, 힙 영역은 공유하고 스택 영역만 분할하여 사용하는 구조이기 때문에 Context Switching이 발생했을 때 PCB에 저장하는 Task(쓰레드)의 정보는 스택영역만 저장하면 된다. PCB에서 Task(쓰레드)의 정보를 읽어올 때도 스택 영역만 읽어오면 된다.
때문에 Context Switching이 발생했을 때 멀티 쓰레드가 멀티 프로세스보다 비용이 적게 든다.
📝불변객체 (immutable object)
“불변 객체는 간단하고 신뢰성 있는 코드를 만들기 위한 전략이다.” - 오라클 자바 튜토리얼
“불변 객체는 가변 객체보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다.” - 이펙티브 자바
객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. 그렇기 때문에 한 번 생성이 되면 신뢰할 수 있는 객체가 된다. 그리고 불변객체는 간단하고 구현하기 쉬우며 쓰레드에 안전하다. 그러니 우리는 객체지향 프로그래밍을 하면서 불변객체를 만들기 위해 노력해야한다.
불변 객체를 어떻게 만드는가?
1. setter를 사용하지 않는다. (객체의 상태를 변경하는 메소드 미제공)
2. private으로 선언한다.
3. final을 선언한다.
자세한 내용은 이 전에 작성한 불변객체 글을 참고하자.
📝default method 가 추가된 interface vs abstract method
'기타' 카테고리의 다른 글
Scale-up 과 Scale-out에 대해서 알아보자 (0) | 2021.11.06 |
---|---|
면접 질문 정리 (1) (0) | 2021.10.13 |
[7주차] 멘토링 키워드 (0) | 2021.09.29 |
[6주차] 멘토링 키워드 (0) | 2021.09.19 |
[5주차] 멘토링 키워드 정리 (0) | 2021.09.12 |
댓글