Q. 메모리 구조를 알아봐야하는 이유?
A. 한정된 자원에서 최고의 성능을 낼 수 있도록!
같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다.
java프로그램은 JVM이라는 프로그램에 종속적이기때문에 os에서는 독립되어서 다양한 os 에서 사용가능하다. 대신 JVM을 실행시키고 JVM으로 프로그램을 실행시키다보니 OS에 직접 제어받는 방식보다 속도면에서 느리다.
jvm이란?
JVM(java.exe)은 무엇을 하는가?
자바 소스 파일은 자바 컴파일러에 의해 바이트 코드로 되고, 클래스 로다가 읽어들이면서 JVM이 수행된다.
클래스 파일을 로딩한 뒤 검증하고 초기화한다.
Class파일을 메모리(Runtime Data Area)에 적재하는 기능
클래스 파일을 저장하는 runtime DataArea
여기는 class area, heap, java stacks,
pc registers, native method stacks 이렇게 5가지의 영역으로 나누진다.
프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
Class area
모든 쓰레드가 공유하는 클래스 영역이다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, static, 변수 등의 바이트 코드를 보관한다.
Heap area
모든 쓰레드가 공유하며, new연산자로 생성된 객체와 배열이 생성되는 영역이다.
또한, 클래스 영역에 로드된 클래스만 생성이 가능하고 garbage collcetor가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
모든 객체들은 힙에 저장된다.
Stack area
Last In First Out (LIFO)
메소드 호출 시마다 각각의 스택(그 메소드만을 위한공간)이 생성된다. 그리고 메소드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시로 저장한다. 마지막으로, 메소드 수행이 끝나면 프레임별로 삭제한다.
함수 호출시 지역변수는 스택에 있다. 스택은 접시마냥 아래에서 위로 쌓인다. 접시쌓기 게임을 생각해보자!
클래스파일을 플랫폼에 맞는 기계어로 변환시켜 실행한다.
Heap 메모리에 생성된 객체 중에서 참조되지 않는 객체들을 탐색후 삭제해서
삭제된 객체의 메모리를 반환한다.
참고
https://re-build.tistory.com/2?category=705468
https://cafe.naver.com/jjdev/227