예전에 프로젝트를 할때, 이유없이 메모리가 가득 할당되어 당황한적이 있었는데 확인해보니 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가 관리하지 않는 영역이기 때문에 프로그램 종료 시 까지 할당받은 메모리가 유지된다.
'IT' 카테고리의 다른 글
[K8S] 쿠버네티스 개념이해하기 (1) | 2023.12.15 |
---|---|
[JAVA] Thread 개념 (single/multi) (0) | 2023.12.15 |
[Python] 동영상 수집 모듈 만들기 (1) | 2023.11.30 |
ElasticSearch (1) | 2023.11.28 |
[Docker] ElasticSearch 설치하기 (1) | 2023.11.28 |