자바의 메모리 모델과 Object 클래스

2022-04-23-자바의-메모리-모델과-Object-클래스

목차

01.자바 가상머신의 메모리 모델

01.1 메모리영역의 종류

메소드 영역

스택 영역

힙영역

02.메모리 모델 설명

03.메소드 영역

04.스택 영역

05.힙 영역

01.자바 가상머신의 메모리 모델

  • 운영체제 관점에서 가상머신도 그냥 프로그램

    • 운영체제가 일반 프로그램에게 4G의 메모리 공간을 할당해주면 JVM에게도 4G메모리 공간을 할당
  • 자바 프로그램이 두 개 실행 되면 가상머신도 두개 실행

01.1 메모리영역의 종류

메소드 영역

  • 메소드의 바이트 코드, static 변수

스택 영역

  • 지역변수, 매개변수

힙영역

  • 인스턴스

02.메모리 모델 설명

  • 대게 Hello.java -> xxx.class 이렇게 생성이되는데

    • xxx에는 컴파일러의 결과 같은 실행 명령어들이 있음
    • 즉, 자바소스코드의 바이트 코드가 담김
  • 우리가 만드는 소스는 main -> 메소드들을 호출하는 식인데

    • 메소드의 호출에 대한 정보가 담긴다고 생각하면 쉬울듯

03.메소드 영역

  • 메소드 영역에는 바이트 코드와 static 변수가 있는데

    • 이것들의 특징은 프로그램 종료시 까지 필요한 것들
  • 프로그램 종료시까지 사라지면 안되는 것들이 들어간다고 생각하면 좋음

    • 주로 메소드들이 많긴함

04.스택 영역

  • 지역변수와 매개변수가 들어감

    • 임시저장의 요소가 들어간다고 생각하면 쉬움
public static void adder(int n1, int n2){
	int result = n1 + n2;
}
  • 위와 같이 있는 경우

    image-20220423182959063

05.힙 영역

  • 인스턴스가 저장되는 영역

    • 왜 힙에 인스턴스를 저장하는가?
    • 참조변수인 지역변수는 스택에 있는데 같이 스택에 있으면 안되는지에 대한 대답
    • 스택에 저장되는 것들은 대게 리턴을 만나면 사라지는데 만약에 우리가 참조변수로 인스턴스를 참조했는데 그 참조가 끊어졌을때
    • 그냥 같이 사라져도 되지 않는다라는 의문이 생김
    • 그렇게 되면 한개일때는 문제가 되지 않지만 두개를 참조하고 있다면

      • 그렇게 되면 안됨
      • 참조가 하나 지워졌다고 인스턴스가 같이 지우면 문제생기기때문에 따로 관리를 함
      public static void simple(){
      	String str1 = new String("abc");
          String str2 = str1;
      }
  • 하나의 인스턴스를 둘 이상 참조변수가 참조하는 경우가 힙에 저장하는 이유이고
  • 이 참조변수가 끊어짐을 판별하여 jvm에서 하는 액션 그것을 가비지 컬렉션이라고하는데 지워주는일을 대신해준다.

Written by@[KyeongMinPark]
Docker, C++, C#, Java, Golang으로 개발 모니터링운영 및 개발, 자원수집기 Beat & Exporter 개발 Gitlab Runner CI/CD & Hugo 연동과 테스트코드및 등을 공부와 개발중 ORM, TDD, BDD, DDD, DesignPattern, WebAssembly Studying

GitHub