Language/Java

[Java] JVM의 Runtime Area

ooeunz 2020. 1. 13. 12:58
반응형

 

JVM (Java virtual machine)에 관하여 살펴보겠다.

 

Heap 영역

자바 객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM ㅅ택 영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조 값이 없다면 쓰레기로 취급하고 JVM은 GC를 이용하여 객체를 힙 영역에서 제거한다. 

 

 


Stack 영역

각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 추가적으로 스레드를 생성하지 않았다면 main 스레드 하나만 존재하므로 JVM 스택 역시 하나이다. JVM 스택은 메서드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다. 예외 발생 시 printStackTrace()는 메서드를 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현한다.

 

자바는 코드 실행흐름에 따라 스택 영역에 메모리를 할당하는데, 기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만 참조 타입 변수는 값이 아니라 힙 역역이나 메서드 영역의 객체 주소를 가진다.

 


Null / NullPointerException

위에서 언급했듯 참조타입 변수는 힙 영역의 객체를 참조해야 한다. 하지만 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다. Null 값 역시 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다. 그런데 이러한 참조 타입 변수를 잘못 사용하면 에러가 발생하는데 그 에러의 이름이 바로 NullPointerException이다. 예를 들어, 참조 타입 변수가 null을 가지고 있을 경우 참조 타입 변수는 사용할 수 없다. 참조 타입 변수를 사용하는 것은 곧 객체를 사용하는 것을 의미하는데, 참조할 객체가 없으므로 사용할 수가 없는 것이다.

 

아래의 코드를 보자.

Int[] arr = null;

arr[0] = 5;

 

위의 코드에서 arr은 배열 타입이므로 참조 타입 변수이다. 그래서 힙 영역의 특정 객체를 참조하지 않고 null 만으로도 초기화가 가능하다. 하지만 이 상태에서 arr[0]에 5라는 값을 저장하려고 하면 NullPointException에러가 발생한다. 왜냐하면 arr 변수가 참조하는 배열 객체가 없기 때문이다.

 

논리적으로 생각하면 아주 간단한 에러사항이지만, 긴 코드를 작성하다 보면 손쉽게 놓칠 수 있는 에러가 바로 NullPointerException 에러이다. 이 에러는 디버깅하기가 어려우므로 그때그때 잘 확인하는 습관이 필요하다.

반응형