[기술면접] GC 동작 과정, 버블 정렬, 문자열 관련 함수

업데이트:


자바 GC 동작 과정

GC는 Garbage Collection의 줄임말로 Java 프로세스가 동작하는 과정에서 불필요한 또는, 더 이상은 사용하지 않는 객체들을 메모리(Heap)에서 제거함으로써, Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 해준다.


동작 과정
먼저 메모리에 적재되어 있는 객체가 현재 사용중인지 아닌지를 판단해야한다. 이를 판단하는 기준은 오래된 객체이다. JVM에서는 이 오래됨을 표현하기 위해 Heap 메모리를 여러 영역으로 나눈다.
크게 2가지 공간으로 나뉘는데, 둘로 나뉜 이 공간이 Young 영역과 Old 영역이다.

  • Young Generation 영역 : 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다.
    • Young Generation 영역 안에는 Eden, Survivor1, Survivor2 영역으로 구성된다.
    • Eden 영역에서 살아 남은 객체는 Servivor 영역으로 이동한다. Minor GC가 발생할 때마다 Survivor1에서 Survivor2 영역으로 또는 Survivor2 영역에서 Survivor1 영역으로 이동하게 되며, 더이상 참조되지 않는 객체는 메모리에서 제거된다.
    • Minor GC가 발생하는 동안 Survivor1, Survivor2 영역을 오가며 살아남은 객체들은 최종적으로 Old Generation 영역으로 옮겨진다.
  • Old Generation 영역 : 접근 불가능한 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC가 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다.


참고로 오래 살아남은 기준은 Minor GC가 발생하는 동안 얼마나 오래 살아남았는 지로 판단한다. 각 객체는 Minor GC에서 살아남은 횟수를 기록하는 age bit를 가지고 있으며, Minor GC가 발생할 때마다 age bit의 값이 1씩 증가하며, age bit 값이 MaxTenuringThreshold 설정값을 초과하게 되는 경우 Old Generation 영역으로 이동한다.






버블 정렬

버블 정렬은 거품 정렬이라고도 하며, 두 인접한 원소를 검사하여 정렬하는 방법이다. 시간 복잡도가 O(n2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다.






String, StringBuffer, StringBuilder

String은 불변의 속성을 갖는다. 간단히 말하자면 String은 내부의 문자열을 수정할 수 없다. 기존에 있던 String에 다른 문자열을 연산하면 기존에 메모리(Heap)에 있던 객체에 추가되는 게 아닌, 연산된 문자열을 저장한 새로운 객체가 메모리에 생성된다. 그러므로 문자열 연산자를 많이 사용할수록 String의 객체 수가 늘어나기 때문에, 프로그램 성능을 느리게 하는 요인이 된다.
반면 StringBuffer 또는 StringBuilder 클래스는 내부 버퍼1에 문자열을 저장해 두고, 그 안에서 추가, 수정, 삭제 작업을 할 수 있다. StringBuffer와 StringBuilder의 사용법은 동일하지만 차이점은 StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만, StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있다.

참고


  1. buffer - 데이터를 임시로 저장하는 메모리 

태그:

카테고리:

업데이트:

댓글남기기