Garbage Collector

BackEnd_Ash.log·2023년 7월 14일
0

자바스터디

목록 보기
5/19

모든 질문과 답변은 chat gpt 와 바드의 복붙입니다.

가비지 컬렉터
면접때 받았던 질문이다.

가비지 컬렉터가 뭐에요 ?? 뭐지 쓰레기 컬렉터인가 ㅡ_ㅡ...

가비지 컬렉터란

가비지 컬렉터(Garbage Collector)는 더 이상 참조되지 않는 메모리를 자동으로 해제하는 프로그램입니다. 자바 스프링에서 가비지 컬렉터는 GC(Garbage Collector)라고도 합니다.

GC는 힙 메모리에서 더 이상 참조되지 않는 오브젝트를 찾습니다. 오브젝트가 더 이상 참조되지 않으면 GC는 해당 오브젝트를 힙 메모리에서 해제합니다.

GC는 힙 메모리에서 오브젝트를 찾는 방법에 따라 여러 가지 알고리즘을 사용합니다. 가장 일반적인 알고리즘은 Mark-and-Sweep 알고리즘입니다.

Mark-and-Sweep 알고리즘은 다음과 같이 작동합니다.

  1. GC는 힙 메모리의 모든 오브젝트를 검사합니다.
  2. GC는 참조되고 있는 오브젝트를 Mark합니다.
  3. GC는 Mark되지 않은 오브젝트를 Sweep합니다.

Sweep는 Mark되지 않은 오브젝트를 힙 메모리에서 해제하는 것을 의미합니다.

GC는 힙 메모리에서 오브젝트를 찾고 해제하는 작업을 주기적으로 수행합니다. GC의 주기적인 실행은 힙 메모리를 효율적으로 관리하는 데 도움이 됩니다.

GC는 자바 스프링에서 중요한 역할을 합니다. GC는 힙 메모리에서 더 이상 참조되지 않는 오브젝트를 자동으로 해제하여 힙 메모리의 사용량을 줄이고 성능을 향상시킵니다.

라고 한다.

가비지 컬렉터라는 녀석이 메모리에서 모든 오브젝트를 검사하는것 같다.
검사를해서 참조되고 있는 오브젝트는 Mark 를 한다 엇 !! 나 사용하고 있네 !!
그리고 Mark 사용하고 있지않는 오브젝트는 Sweep 해제 한다고 생각하면 편할것 같다.

이때

일부 가비지 컬렉터는 메모리를 더 효율적으로 관리하기 위해 사용 중인 객체를 메모리의 한쪽 끝으로 이동시키는 compacting 단계를 수행하기도 합니다. 이렇게 하면 연속된 메모리 공간이 확보되어 메모리 할당이 효율적으로 이루어질 수 있습니다.
이를 compacting 이라고도 한다.

근데 이거 공부왜해 ??
그냥 단순히 면접에서 질문 받으니까 ??

근데 이거 왜 알아야해 ?

자바의 가비지 컬렉션(Garbage Collection, GC) 이해는 성능 최적화와 밀접한 관련이 있습니다. 왜냐하면 GC는 자바 어플리케이션의 메모리를 관리하는 중요한 요소이기 때문입니다. 다음은 가비지 컬렉션 이해와 성능 최적화와의 관계를 설명하는 몇 가지 요소입니다:

  1. GC Pause Time 최소화: 가비지 컬렉션 동작 중에는 일반적으로 애플리케이션의 실행이 일시 중지되는데, 이를 GC Pause라고 합니다. 이 시간 동안에는 새로운 객체를 생성하거나, 애플리케이션 코드를 실행할 수 없기 때문에 애플리케이션의 반응성에 영향을 줄 수 있습니다. 따라서, GC pause time을 최소화하는 것은 성능 최적화의 중요한 목표 중 하나입니다.

  2. 메모리 누수 방지: 객체가 더 이상 필요하지 않음에도 불구하고 계속 메모리에 남아있으면, 이를 메모리 누수라고 합니다. 메모리 누수는 애플리케이션의 전반적인 성능에 영향을 미치며, 심한 경우에는 OutOfMemoryError를 일으킬 수 있습니다. 가비지 컬렉션과 객체 참조에 대한 정확한 이해를 통해 이러한 메모리 누수를 방지할 수 있습니다.

  3. 효율적인 메모리 사용: 자바 가상 머신(JVM)의 힙 메모리는 일반적으로 여러 영역으로 나뉘며, 각 영역은 서로 다른 종류의 객체를 위해 사용됩니다. 이러한 메모리 구조와 가비지 컬렉션 동작 방식에 대한 이해는, 애플리케이션의 메모리 사용 효율을 향상시키고, GC 동작을 예측하고, 애플리케이션의 성능을 최적화하는데 도움이 됩니다.

  4. GC 알고리즘 선택: JVM은 여러 가지 가비지 컬렉션 알고리즘을 제공합니다. 각 알고리즘은 특정 유형의 애플리케이션에 가장 잘 맞도록 설계되었으므로, 애플리케이션의 요구 사항에 맞는 가장 적합한 GC 알고리즘을 선택하는 것은 중요합니다. 이를 위해서는 각 GC 알고리즘의 동작 방식을 이해하는 것이 필수적입니다.

따라서, 가비지 컬렉션에 대한 깊은 이해는 애플리케이션의 성능 최적화에 있어 핵심적인 역할을 합니다.

하지만 가비지 컬렉터는 mark 와 sweep 로 자동으로 해결해주는거 아니야 ?

그렇습니다, 가비지 컬렉터(Garbage Collector, GC)는 자바의 메모리 관리 시스템의 일부로서, 더 이상 사용되지 않는 객체를 자동으로 식별하고 삭제하는 역할을 합니다. 이 과정은 'mark'와 'sweep' 또는 'delete'라는 두 가지 주요 단계로 구성됩니다.

그러나 GC의 이해는 성능 최적화에 도움이 되는 이유는, GC 동작 방식과 그 결과에 따른 성능 향상 또는 저하를 이해하고 최적화하는 데 중요하기 때문입니다.

  • GC가 동작하는 동안, 애플리케이션이 일시 중단될 수 있습니다. 이 'GC Pause'는 애플리케이션의 반응성에 영향을 미칠 수 있습니다. GC 휴지 시간을 최소화하기 위해, GC 알고리즘을 올바르게 선택하거나 튜닝하는 것이 필요할 수 있습니다.

  • 메모리 누수는 GC가 처리할 수 없는 문제입니다. 객체가 더 이상 필요하지 않지만 계속해서 참조되면, 해당 객체는 GC에 의해 회수되지 않으며 이는 메모리 누수로 이어집니다. 이 문제는 프로그래머가 코드에서 객체 참조를 적절히 관리함으로써 방지해야 합니다.

  • JVM의 힙 메모리 구조와 GC의 동작 방식에 대한 이해는, 애플리케이션의 메모리 사용 효율을 향상시키는 데 도움이 됩니다. 이는 애플리케이션의 성능 최적화에 중요한 요소입니다.

따라서, 가비지 컬렉션이 자동으로 동작한다는 것은 사실이지만, 그 동작 방식과 세부 사항을 이해하고, 이에 따른 성능 향상 또는 저하를 관리하고 최적화하는 것은 매우 중요합니다.

위에서 말한 3가지 중에 앞에 두가지에 대해서 상세히 설명해줘

  1. GC Pause와 애플리케이션의 반응성: GC가 실행되는 동안에는 가비지 컬렉터가 메모리를 정리하고, 정리해야 할 객체를 찾아내는 작업을 수행하기 때문에, 애플리케이션이 일시적으로 멈출 수 있습니다. 이를 GC Pause라고 하며, 이 시간 동안은 새로운 객체를 생성하거나 애플리케이션 코드를 실행하지 못합니다. 이러한 GC Pause는 애플리케이션의 반응성, 즉 사용자가 애플리케이션에 요청을 보냈을 때 응답을 받는 시간에 영향을 줄 수 있습니다. 따라서, GC 알고리즘을 올바르게 선택하고, GC 휴지 시간을 최소화하는 방향으로 JVM을 튜닝하는 것이 중요합니다. 예를 들어, 최신 JVMs(Java Virtual Machines)는 'G1 GC', 'Z GC', 'Shenandoah' 등과 같은 저지연 GC 알고리즘을 제공하며, 이들은 GC pause 시간을 크게 줄일 수 있습니다.

  2. 메모리 누수와 객체 참조 관리: 가비지 컬렉터의 주요 역할은 더 이상 참조되지 않는 객체를 식별하고 메모리에서 제거하는 것입니다. 그러나 객체가 더 이상 필요하지 않음에도 불구하고 다른 객체가 그것을 계속 참조하고 있다면, 해당 객체는 GC에 의해 회수되지 않습니다. 이렇게 되면 해당 객체는 메모리를 계속 차지하게 되어, 결국 메모리 누수를 발생시킵니다. 이는 애플리케이션의 전반적인 성능을 저하시키고, 심한 경우에는 OutOfMemoryError를 발생시킬 수 있습니다. 이러한 문제를 방지하려면, 프로그래머는 코드에서 객체 참조를 적절히 관리해야 합니다. 이는 객체가 더 이상 필요하지 않을 때 참조를 해제하거나, 적절한 범위에서만 객체를 참조하도록 코드를 작성함을 의미합니다.

이 두 가지 사항을 이해하고 관리하는 것은 자바 애플리케이션의 성능 최적화에 매우 중요합니다.

profile
꾸준함이란 ... ?

0개의 댓글