<
자바가 메모리를 사용하는 방식
>
🌠다음 포스팅🌠

객체지향설계의 5대 원칙 - DIP 편
☄이전 포스팅☄

자바 프로그램의 개발과 구동
static / heap / stack 메모리 영역

🚀 프로그램이 메모리를 사용하는 방식

제목 없음

하나의 프로그램이 실행될 때 프로그램이 메모리를 사용하는 방식이다.

기계어를 포함한 모든 프로그래밍이 언어의 공통된 메모리 사용방식이며 OOP에서는 데이터 저장 영역을 다시 3개의 영역으로 나누어 사용한다.

🌠 main() 메소드 : 메소드 스택 프레임

개발과구동

자바가 실행되면 JRE는 프로그램 내부의 main() 메소드의 유무를 확인하고 이어서 JVM이 역할을 이어 받아 전저리 과정을 이어간다.

프로그램이 실행되면 JVM실행에 필요한 패키지(ex. java.lang)Static 영역에 저장한다. 그리고 JVM은 개발자가 작성한 모든 클래스패키지 역시 Static영역에 저장한다.

☄ main() 메소드가 실행되기 전 JVM에서 수행하는 전처리 작업들

☄ main() 메소드가 실행된 후의 작업들

제목 없음

main() 메소드가 실행되면 클래스 내의 모든 메소드들은 Stack 영역에 저장된다.

때문에 Stack영역메소드들의 놀이터라고 부르는 것이며

저장이 되었다면 마지막으로 arg인자를 저장한 변수 공간을 확보해야한다.

최종적으로 모든 Class와 Method를 구성한 저장한 이후에 명령문이 시작하게 되는 것이다.

Heap 영역은 어떻게 사용되는가?

위 그림에서 나오듯 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영역을 공유하여 사용할 수 있어 개발자가 두 영역의 데이터를 수정하게 된다면 예상치 못하는 값이 도출 된다.

이것을 스레드 안전정 문제라고 한다.

☄ 멀티 프로세스는 다수의 저장 영역을 생성하는 것 , 즉 다음과 같은 메모리 구조가 된다.

제목 없음

멀티 프로세스는 서로의 메모리를 침범하지 않아 안전성이 높게 평가되지만 반대로 메모리 사용량이 그만큼 커지게 된다.

🧾 Reference

Top
Foot