IT

[JAVA] 메모리영역

뽀리님 2023. 12. 15. 10:39

예전에 프로젝트를 할때, 이유없이 메모리가 가득 할당되어 당황한적이 있었는데 확인해보니 WebClient 를 잘못쓰면 메모리 누수가 일어난다고한다

 

이에 따라 다시 기본적으로 자바 메모리에 대해 정리해본다

 

Java 메모리 영역

자바 프로그램을 실행 하게되면 JVM(Java Virtual Machine) OS 부터 메모리를 할당 받는다, 할당 받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용하게 된다.

 

 

JVM?

Java Virtual Machine (JVM)은 Java 언어로 작성된 프로그램을 실행하기 위한 가상 머신으로, 운영체제와 독립적이다. Java 프로그램은 바이트 코드로 컴파일되어 JVM에서 실행되기 때문에, JVM은 어떤 운영체제 위에서도 동일한 방식으로 동작한다.

  • 바이트 코드: 자바 소스 코드는 자바 컴파일러에 의해 컴파일되어 바이트 코드로 변환된다. 이 바이트 코드는 JVM에서 실행되기 위한 중간 언어로, 운영체제에 의존하지 않는다.
  • Java의 크로스 플랫폼 특성: Java는 "Write Once, Run Anywhere (WORA)"의 철학을 가지고 있다. 즉, 한 번 작성한 코드는 어느 운영체제에서든 실행될 수 있도록 고안되었다.
  • JVM 역할: JVM 운영체제와 상호작용하여 프로그램을 실행하고 관리하지만, 자바 프로그램은 JVM 위에서 동작하며 JVM 해당 운영체제와 통신하여 자바 프로그램을 실행한다.

 

- JVM의 메모리는 크게 3가지로 이루어져 있다.

 

Heap 영역 

  • new 를 이용하여 객체를 생성할 때 저장된다
  • 참조형 데이터 타입이 저장된다. (String, 배열(array), enum, class, interface), Object
  • Heap 영역의 데이터들을 가르키는 Reference(참조 주소)는 Stack영역에 적재
  • Reference를 통해서만 Heap 영역의 데이터들에 접근, 핸들링
  • 쓰레드가 몇개가 존재하든,  하나의 영역만 존재
  • 참조형데이터의 값은 여기에 저장됨 (ex.String temp = "abc"; 가 있다면 "abc"는 힙에 temp(주소값)은 스택에)
  • 호출이 종료되도 삭제되지 않는다. -> GC(가비지 컬렉터)에 의해 메모리에서 해제(라고하지만 안되는 경우가 더러있다. 이부분이 보안관련하여 잘 생각해봐야한다. 특히 String의 경우 힙에서 삭제가 안되는 경우가 있기에 추후 보안에 취약할수가있다. 이렇게 때문에 보안관련된 정보는 String 보다는 byte,char 와 같은 원시타입으로 저장해야한다.)

 

Stack 영역 

  • 기본변수(원시변수), 지역변수, 매개변수가 저장되는 메모리
  • 메서드 내부의 기본자료형에 해당하는 변수 적재
  • Heap 영역에 생성된 데이터의 주소값이 할당
  • 메서드가 호출될때 할당되고, 메서드 종료시 메모리에서 삭제
  • Thread 마다 자신만의 Stack 가진다. (1:1) - (Thread : Stack) 
  • Thread 내부적으로 Static, Heap, Stack 영역이 있다.
  • Thread 다른 Thread 접근 없지만, static, Heap 영역을 공유하여 사용 가능.
  • 공유하는 경우 먼저 접근하는 쓰레드가 공유 영역을 lock 하고 다 사용한 다음 다른 스레드가 접근할 수 있도록 unlock 해야한다.
  • 참고로 Java에서는 lock, unlock을 synchronized 키워드를 사용해서 처리할 수 있다. (메소드 혹은 블럭은 보호 구역으로 지정)

 

Static 영역(데이터영역,메소드영역)

  • static은 java에서 메서드, 필드 등에 붙일 수 있는 키워드
  • static은 스레드끼리 공유되는 자원으로, 클래스당 하나만 생성된다.
  • jvm 내에서 static은 heap 영역이 아닌 클래스 코드가 저장되는 static공간에 메모리가 할당됩니다. static 공간은 GC가 관리하지 않는 영역이기 때문에 프로그램 종료 시 까지 할당받은 메모리가 유지된다.