-
[JAVA] 컴퓨터와 자바 메모리에 대한 이해Programming🧑💻/Java 2023. 3. 7. 12:52
컴퓨터 메모리
- 컴퓨터 메모리는 두가지 종류로 구분된다.
- 비휘발성 기억 장치 : 전원 공급이 없어도 저장된 데이터를 유지한다. (컴퓨터가 종료되어도 데이터가 저장되어 있음) ex)HDD,SDD
- 휘발성 기억 장치 : 데이터 유지를 위해서는 지속적인 전원 공급이 필요하다. (컴퓨터 종료시 데이터가 휘발) ex)RAM
메인 메모리
- CPU는 HDD, SDD 같은 비휘발성 기억장치보다 RAM으로 되어 있는 메인 메모리에 빠른 접근이 가능하다.
- 메인 메모리 상에는 현재 실행중인 어플리케이션과 관련된 데이터들이 저장된다.
- 어플리케이션 실행시, 종류 직전 후에 다시 실행하는 것보다 컴퓨터 종료 후 다시 실행하는 것이 조금 더 오래 걸리는 이유는 메인 메모리가 캐시 또는 버퍼의 역할을 하기 때문에 어플리케이션 실행에 필요한 일부 데이터를 들고 있기 때문이다.
- 메인 메모리를 구성하는 RAM은 휘발성 기억장치로 전원공급 차단시 저장된 데이터가 모두 휘발된다.
- 메인 메모리는 RAM 이외에 ROM(Read-Only Memory)가 함께 구성된다. 이는 비휘발성 기억 장치로 컴퓨터 부팅시 필요한 데이터를 저장한다.
JVM
- Java 소스코드는 자바 컴파일러을 통해 바이트 코드로 컴파일 된다. ( .java files -> .class files)
- 컴파일된 파일(.class)는 바이트 코드로 구성되어 있으며 JVM을 통해 실행된다.
- 어떤 플랫폼(mac,window,linux)이든 상관없이 해당 플랫폼 상에 호환되는 JVM이 있으면 한번 바이트코드로 컴파일된 파일은 어디서든 실행이 가능하다.
- 컴파일 된 파일은(.class)는 바이트 코드로 JVM상에 실행되기 때문이다.
- JVM이 플랫폼 환경에 맞추어 머신코드 변환해주기 때문에 플랫폼 환경에 따라 다시 컴파일 하는 과정을 거치지 않아도 된다.
컴파일 된 파일(.class)은 바이트 코드로 구성되어 있으면 JVM에 의해서 실행된다.
메모리 관리와 JVM
- JVM은 할당받은 메모리에 자바 프로그램을 실행하는데 필요한 데이터를 저장한다.
- JVM은 메모리 할당과 해제를 내부에서 자동으로 처리한다.
자바이전의 메모리 관리
- C, C++ 같은 언어에서는 메모리 관리를 개발자가 직접 해주어야한다.
- 즉 메모리의 할당과 해제를 직접관리해야한다.
- 수동 메모리 관리의 불편한 점
- Dangling pointers: 메모리를 해제한 이후 포인터를 잡고 있는 변수를 NULL로 하지 않을 경우 발생
- Memory leaks : 메모리를 해제하지 않으면 필요없는 데이터에 메모리를 낭비하게 된다.
- Boilerplate code: 메모리를 관리하는데 너무 많은 코드가 필요하다.
- Error-prone : 수동으로 하는 메모리 관리는 실수를 유발하기 쉽다.
메모리 관리 이해를 위한 JVM 구성요소
1. Class loader : 모든 클래스 파일을 로딩하고 바이트코드를 확인한다.
2. Runtime data areas : 메모리상에 클래스데이터, 명령어를 할당한다.
3. Execution engine : Class loader를 통해 로딩되고, Runtime data areas에 저장된 데이터들을 이용해 바이트코드를 실행한다.
4. Java Native Interface(JNI) : Execution engine은 JNI과 상호작용하며 바이트 코드 실행에 필요한 기본 라이브러리를 사용한다.
Runtime data areas
Runtime data areas는 Stack area, Heap area, Method area, PC registers, Native method stack area 로 구성되어 있다.
Heap area- JVM 작동 시작시, 자바 어플리케이션 실행시 동적 메모리 할당에 사용할 RAM 일부를 예약해두는데 이 곳을 Heap이라한다.
- 클래스의 인스턴스들이 이곳에 저장된다.
- JVM은 Heap 데이터들을 위한 메모리를 할당하고, garbage collection 프로세스를 통해 메모리를 정리한다.
- garbage collection 방식은 Heap내의 영역 구분에 따라 다르게 동작한다.
Stack area- JVM 스택은 원시형 값(primitives)와 참조형값의 참조값(Heap상의 저장된 메모리 위치값)이 저장된다.
- 메서드를 호출하면 스택내에 각 메서드에 대한 메서드 프레임을 생성하고, 이 메서드 프레임 내에는 메서드의 부분결과, 리턴값과 같은 메서드와 관련된 데이터들이 저장된다.
- Stack은 Heap과 달리 각 스레드마다 별도의 Stack이 존재한다.
- 스택은 각 스레드마다 할당되기 된다. 따라서 메모리상의 스택영역은 각 스레드를 위한 여러 스택으로 구성되어 있다.
- 각 스레드는 자기 자신의 스택에만 접근이 가능하다.
Method Area (Meta Space)- Runtime representation of class가 저장되는 곳이다.
- runtime code, static variables, constansts pools, constructor code같은 클래스의 메타 데이터가 저장된다.
- 이전에는 PermGen(Permanent Generation)이라 불렸다.
PC(Promgram Counter) Register- PC Register는 각 스레드마다 구분하여 가지고 있으며, 각 스레드가 실행해야하는 명령어의 순서와 현재 실행중인 명령어의 주소를 가지고 있어 다음의 실행해야하는 명령어를 스레드에게 알려준다.
- Call Stack이라고 부른다.
native method stack- runtime data area에 네이티브 코드 실행을 위해 할당된 메모리
★자세한 내용은 다음을 참고★'Programming🧑💻 > Java' 카테고리의 다른 글
[JAVA] NPE : 널포인트 Exception (0) 2023.03.16 [JAVA] String Constant Pool은 무엇일까? (0) 2022.12.17 [JAVA] final (0) 2022.10.25 [JAVA] static (0) 2022.10.21 [JAVA] Enums (0) 2022.10.08