[개념 학습 및 정리] Java에 포인터가 없는 이유

2021. 1. 15. 16:23코딩 테스트/개념 학습 및 정리

1. Java에 포인터가 없는 이유

1) Java에 포인터가 없는 이유

Java에 포인터가 없는 이유는 Garbage Collector의 원리를 보면 확인할 수 있다.

 

Garbage Collector의 동작 원리를 본다면, 주소가 변경이 될 때 변경된 주소를 잘못 사용할 경우 치명적인 오류를 발생시킬 수 있다. 예를 들어 간단하게 설명한다면 다음과 같다.

 

  • A에 객체를 저장
  • (시간이 지난 후)
  • A에 쓰레기 쌓임
  • A에 필요한 내용을 B에 저장
  • A 정리
  • (시간이 지난 후)
  • B에 쓰레기 쌓임
  • B에 필요한 내용을 A에 저장
  • B 정리
  • 반복

 

즉, 필요한 내용이 A에서 B로, B에서 A로 이동하듯, 객체의 위치(주소)는 매순간 변경이 되는 것을 확인할 수 있다. 따라서 주소의 빈번한 변경으로 인한 실수가 일어나지 않도록 하기 위해 포인터를 사용하지 않는다.

2) Garbage Collector

GC의 동작 원리를 깊게 설명한다면, JVM의 메모리 관리에 대해 알아야 한다. JVM에는 일반적으로 Young Generation과 Old Generation이라는 물리적 공간이 존재한다.

 

- Young Generation

새롭게 생성한 객체가 위치하는 영역이다. 많은 객체가 이 영역에 생성되었다 사라지며 이를 Minor GC라고 한다. 

 

- Old Generation

접근 불가능한 상태가 되지 않아 Young 영역에서 살아남은 객체가 이 영역으로 복사된다. Young 영역보다 크게 할당되며 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC 또는 Full GC가 발생한다.

 

그리고 Young 영역에서는 Eden과 Survivor 영역으로 나뉘어진다. new 키워드를 이용하여 객체를 생성할 때는 Eden 영역에 위치하며 Eden 영역에서 GC가 발생 후 살아남은 객체는 Survivor 영역으로 이동한다. 지속적인 Eden 영역에서의 GC 이후 Survivor 영역으로 객체가 계속 쌓이고 Survivor 영역 내 빈곳으로 살아남은 객체들이 이동한다. 이러한 지속적인 과정을 반복 후 Survivor 영역이 가득 차면 남은 객체가 Old 영역으로 이동한다.

 

2개의 Survivor 영역에 모두 데이터가 존재하거나 모두 사용량이 0이면 시스템은 비정상이다. Old 영역은 기본적으로 데이터가 가득차면 GC를 수행한다.

3) Garbage Collector 튜닝

GC가 실행되기 전 JVM은 애플리케이션의 실행을 멈춘다. 이 과정을 Stop-the-World이라 하며, GC 쓰레드 이외의 쓰레드의 작업이 중지된다. 이 때 Stop-the-World를 줄이는 작업을 GC 튜닝이라고 한다. 모든 Java 애플리케이션에 필수적인 요소는 아니지만 크리티컬한 요청을 담당하는 서버나 코어 엔진의 경우 튜닝이 필요하다. GC 튜닝이 로직에 영향을 미치지 않도록 가능한 늦게 수행하고 객체 생성을 최소화하는 것이 기본적인 원칙이다.

 

GC 튜닝은 String 대신 StringBuilder를 사용하는 것도 메모리 튜닝이라고 할 수 있다. 그 외에는 설정적인 부분으로 JVM 옵션으로 메모리의 크기를 조절하고 여러가지 GC 방식을 옵션으로 지정해주는 등이 있다.

 

728x90