본문 바로가기
Backend/JAVA

[JAVA] JVM 구조, Memory Leak

by 나는 유찌 2020. 4. 11.

회사에서 class 파일 반영 후 서버를 내렸다가 다시 올리는 순간 Memory Leak이라는 메시지가 나오면서 서버가 올라가지 않는 현상이 일어났었다. 당시 상황상 뭔가 이상해서 백업 파일을 다시 원복 시켰는데도 Memory Leak.. 내 코드의 문제도 아니었고 다른 코드의 문제로 결국 다른 서버를 다 내려버리고 다시 올렸더니 그때서야 되었다.

 

신입이라면 모든지 다 찾아보고 공부를 해봐야지 하며 근 일주일간 틈틈이 JVM과 Memory Leak에 대해서 조사를 해보았다.

 

우선 자바의 메모리 관리는 가비지컬렉터가 하므로 JVM도 알아야 했으므로 JVM 설명으로 시작을 해보겠당.

 

 

 


 

 

 

1. JVM (Java Virtual Machine)

 

- 자바 가상 머신.

- 자바 바이트 코드(. class)를 실행하는 주체.

- 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행.

- 자바와 OS 사이 중개자 역할을 수행하여 JAVA가 OS에 종속되지 않고 재사용이 가능.

 

 

 

 

2. JVM 구조 및 메모리

 

JVM 구조

 

 

1) Garbage Collector (가비지 컬렉터, GC)

- 메모리가 부족할 때 쓰레기(가비지)를 정리해주는 프로그램.

- 메모리 할당 -> 사용 중인 메모리 인식 -> 사용하지 않는 메모리 인식

- Heap 영역에서 참조되지 않는 객체를 제거하는 역할.

 

 

2) Class Loader

- Runtime 시점에 클래스를 로딩하게 해 주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드.

 

 

3) Runtime Data Access

- OS로부터 할당받은 JVM의 메모리 영역.

- 자바 애플리케이션을 실행하는데 필요한 데이터를 넣음.

 

- Method : new 연산자로 생성된 객체를 저장하는 공간.

- Stack Area : Thread마다 별개의 프레임으로 저장.

- PC Register : Thread가 현재 실행하고 있는 부분의 주소를 저장.

- Native Method Stack : 자바 외의 언어로 작성된 Native 코드를 위한 메모리 영역.

 

 

4) Execution Engine (실행엔진)

- Class Loader를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행.

 

 

 

 

3. 메모리 누수 (Memory Leak)

 

1) 메모리 누수란?

더 이상 사용하지 않는 객체가 가비지 컬렉션에 의해 회수되지 않고 계속 누적되는 현상을 말한다.

C언어의 경우 메모리를 할당하고 해제하는 코드가 따로 존재하지만 JAVA에서는 존재하지 않고 GC가 해결한다.

그럼 JAVA에서는 메모리 누수가 일어나지 않을까? 전혀 아니다.

만일 메모리 누수가 일어나게 된다면 계속해서 GC를 호출하게 된다.

또한 빈번한 메모리 할당과 회수를 야기해 성능 저하로 이어진다.

또한 'OutOfMemoryError'로 이어져 아예 서버가 다운되는 경우도 존재한다.

 

 

3) 메모리 누수 원인

Stack을 사용해 크기가 커졌다 줄어들면서 제거한 객체들을 처리하지 못하여 발생하게 된다.

 

 

4) 메모리 누수 예방

쓸모없는 참조를 null로 만들어도 된다.

또한 지역변수로 선언하면 GC의 범위에 속하게 되므로 전역 변수보다 지역변수로 선언하는 게 좋다.

 

 

 

 

 

 

 


 

 

 

 

항상 쓰고 나면 별 내용이 없는 것 같다ㅎㅎ..

JVM과 메모리 릭에 대해서 나름 일주일간 시간을 투자하며 공부를 해보았는데..

내 머리에 잘 들어와 있으면 됐다ㅠㅠ..