하나의 프로그램이 실행될 때 프로그램이 메모리를 사용하는 방식이다.
기계어를 포함한 모든 프로그래밍이 언어의 공통된 메모리 사용방식이며 OOP
에서는 데이터 저장 영역을 다시 3개의 영역으로 나누어
사용한다.
자바가 실행되면 JRE
는 프로그램 내부의 main()
메소드의 유무를 확인하고
이어서 JVM
이 역할을 이어 받아 전저리 과정을 이어간다.
프로그램이 실행되면 JVM
은 실행에 필요한 패키지(ex. java.lang)를 Static 영역
에 저장한다.
그리고 JVM
은 개발자가 작성한 모든 클래스
와 패키지
역시 Static
영역에 저장한다.
main()
메소드가 실행되면 클래스 내의 모든 메소드들은 Stack 영역
에 저장된다.
때문에 Stack영역
을 메소드들의 놀이터라고 부르는 것이며
저장이 되었다면 마지막으로 arg인자
를 저장한 변수 공간을 확보해야한다.
최종적으로 모든 Class와 Method를 구성한 저장한 이후에 명령문이 시작하게 되는 것이다.
위 그림에서 나오듯 Heap영역
은 객체 즉 Entity
의 저장소이다.
public class Mouse{
public String name;
public int age;
}
public class MouseDriver {
public static void main(String[] args){
Mouse mouse = new Mouse();
mouse.age = 1;
mouse.name = "생쥐";
mouse = null;
}
}
위 코드에 따라 Entity
을 생성하여 new() 생성자로 호출하게 되면
객체 클라스는 Heap영역
에 저장되어진다.
객체 클라스 라면 static영역
에 저장되어야하지 않을까?
라고 한다면 맞는 말이다.
최초 main()
으로 부터 시작되어 패키지 안의 모든 클래스를 저장하게 되는데
만일 개발자가 new()연산자
로 객체를 생성하는 순간
Heap영역
에 저장되게 되는 것이다.
그리고 마지막 mouse
객체가 Null
처리 된다면 GC(가비지 컬렉터)
가 아무도 참조하지 않는 mouse
객체를 비어있는 쓰레기 메모리로 판단하여
삭제하고 Heap 메모리
에서 지워준다.
멀티 스레드의 장점은 작업의 병렬처리가 가능하다는 점이지만 static영역
과 Heap영역
을 공유하여 사용할 수 있어
개발자가 두 영역의 데이터를 수정하게 된다면 예상치 못하는 값이 도출 된다.
이것을 스레드 안전정 문제라고 한다.
멀티 프로세스는 서로의 메모리를 침범하지 않아 안전성이 높게 평가되지만 반대로 메모리 사용량이 그만큼 커지게 된다.