New World

[JAVA #4] Garbage Collection 본문

Self-Study/Study

[JAVA #4] Garbage Collection

hyeovi 2022. 10. 5. 21:45
728x90
반응형

Garbage Collection

시스템에서 더이상 사용하지 않는 동적 할당된 메로리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것
시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.

 

GC 종류

Minor GC : young 영역, eden이 full 되었을 때
Major GC : old 영역, minor GC가 실패 할 때
Full GC : 전체 heap + permament, Minor, Major GC가 실패 할 때

 

JVM에서 GC 동작 방식

  1. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인
  2. GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행
  3. Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 되어 해당 객체들을 제거

GC Root가 될 수 있는 대상

  • JVM 메모리의 Stack 영역에 존재하는 참조 변수
  • Method Area의 static 데이터
  • JNI에 의해 생성된 객체들

* JNI 란? ( Java Native Interface )

자바 가상 머신 위에서 실행되고 있는 자바코드가 네이티브 응용 프로그램, C, C++, 어샘블리 같은 다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크

 

Collection(컬렉션) 프레임워크

다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합

Collection Map<K, V>
List Set
순서가 있는 데이터의 집합 순서가 없는 데이터의 집합 순서가 없는 키와 값의 한쌍으로 데이터 집합
데이터 중복 허용 데이터 중복 불허 키는 중복을 허용 X, 값은 중복 허용
Vector, ArrayList, LinkedList, Stack, Queue HashSet, TreeSet HashMap, TreeMap, Hashtable, Properties


List

  • ArrayList: 단방향 포인터 구조,  순차적 조회에 강점
  • LinkedList: 양방향 포인터 구조, 데이터 삽입, 삭제가 빠름

Set

  • HashSet: 순서를 보장하지 않으며, 데이터 중복을 허용하지 않음
  • LinkedHashSet: HashSet 특징 + 입력된 순서를 보장한다.
  • TreeSet: 트리기반으로 데이터들 오름차순으로 정렬 저장

Map

  • HashMap: Key는 중복을 허용하지 않으며, Value는 중복을 허용
  • LinkedHashMap: HashMap 특징 + 입력된 순서를 보장한다.
  • TreeMap: 트리기반으로 Key와 Value를 저장하며, Key를 기준으로 오름차순 정렬

헷갈리는 컬렉션 비교

Vector vs ArrayList

Vector ArrayList
동기화된 상태 -> 느린 속도 동기화가 안된 상태 (-> 빠른 속도)
:= 멀티쓰레드 환경이 아닐 경우 사용)

ArrayList vs LinkedList

ArrayList LinkedList
내부적으로 데이터를 배열로 관리
데이터 추가/삭제 시 임시 배열을 생성해 데이터를 복사
내부적으로 노드 단위로 데이터를 관리
자신의 앞 뒤 노드만 인지하는 상태
데이터별 인덱스가 있어 검색에는 유리 인덱스가 따로 없기 때문에 검색 시 전 노드를 순회해야하여 검색시 불리
임시 배열을 사용하기 때문에 데이터 추가/삭제의 경우에는 불리 불필요한 데이터 복사가 없어 데이터 추가/삭제 시 유리

Stack vs Queue

STACK QUEUE
LIFO(Last In First Out)의 후입선출 구조 FIFO(First In First Out)의 선입선출 구조
데이터 입력 : push();
데이터 출력 : pop();
데이터 입력 : enQueue();
데이터 출력 : deQueue();
예) 시스템 스택 : 함수의 호출과 복귀 순서는 스택의 구조를 응용하여 관리
- 역순 문자열 만들기, 수식의 괄호 검사, 수식의 후위 표기법 변환
예) 우선순위가 같은 작업 예약(인쇄 대기열), 선입선출이 필요한 대기열(티켓 카운터)
* Linear Queue(선형큐)는 메모리 재사용이 불가능 이러한 문제점을 보완하여 Circular Queue(원형 큐)가 나옴

 

스택 오버플로우가 왜 일어나는가?

스택포인터가 스택의 경계를 넘어 설 때 일어난다. 호출 스택은 제안된 양의 주소공간을 이루며 프로그램 시작 시 결정된다.

 

메모리 누수가 무엇인가?

프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상

더 이상 사용하지 않는 객체가 GC에 의해 회수되지 않고 누적되는 현상으로, old영역에 누적된 객체로 인해서 메이저 GC가 빈번히 발생하게 되고 프로그램의 응답속도가 늦어지다 결국 Out of memory 오류로 프로그램이 종료된다.

 

메모리 누수를 막기위한 방법

참조값을 갖는 변수가 최소한의 유효범위안에 있도록 한다.
Local변수로 만들 경우 자동으로 GC의 대상이 되는 것을 예로 들 수 있습니다.

 

HashMap vs HashTable vs ConcurrentHashMap

HashMap HashTable ConcurrentHashMap
주요 메서드에 synchronized 키워드없습니다 주요 메서드에 synchronized 키워드가 선언 되어 있습니다.
HashMapthread-safe 하도록 만든 클래스
key, value에 null을 입력할 수 있습니다. key, value에 null을 허용하지 않습니다. key, value에 null을 허용하지 않습니다.

? 왜 Collection 을 사용하는 것일까?

다수의 데이터를 다루는데 표준화된 클래스들을 제공해주기 때문에 DataStructure 를 직접 구현하지 않고 편하게 사용한다. 배열과 다르게 객체를 보관하기 위한 공간을 미리 정하지 않아도 되므로, 상황에 따라 객체의 수를 동적으로 정할 수 있어 프로그램의 공간적인 효율성 또한 높여준다.

 

제네릭

객체의 타입을 컴파일 시에 체크하여 객체의 타입 안전성을 높이고 형변환의 번거로움을 덜어 코드도 더 간결해진다.
Collection 내부에서 들어온 값이 내가 원하는 값인지 별도의 로직처리를 구현할 필요가 없어지며 API를 설계하는데 있어보다 명확한 의사전달이 가능


예를 들면, Collection에 특정 객체만 추가 or 특정한 클래스의 특징을 갖고 있는 경우에만 추가될 수 있도록 하는 것

반응형
Comments