CodeGym/Java Course/모듈 3/JVM의 메모리

JVM의 메모리

사용 가능

JVM의 메모리 이해

이미 알고 있듯이 JVM은 자체적으로 Java 프로그램을 실행합니다. 다른 가상 머신과 마찬가지로 자체 메모리 구성 시스템이 있습니다.

내부 메모리 레이아웃은 Java 애플리케이션이 작동하는 방식을 나타냅니다. 이러한 방식으로 응용 프로그램 및 알고리즘 작동의 병목 현상을 식별할 수 있습니다. 어떻게 작동하는지 봅시다.

JVM의 메모리 이해

중요한! 원래 Java 모델이 충분하지 않아 Java 1.5에서 수정되었습니다. 이 버전은 오늘날까지 사용됩니다(Java 14+).

스레드 스택

JVM이 내부적으로 사용하는 Java 메모리 모델은 메모리를 스레드 스택과 힙으로 나눕니다. 논리적으로 블록으로 나누어진 Java 메모리 모델을 살펴보겠습니다.

스레드 스택

JVM에서 실행되는 모든 스레드 에는 자체 스택이 있습니다 . 스택은 차례로 스레드가 호출한 메서드에 대한 정보를 보유합니다. 이것을 "콜 스택"이라고 부르겠습니다. 스레드가 코드를 실행하자마자 호출 스택이 다시 시작됩니다.

스레드 스택에는 스레드 스택에서 메서드를 실행하는 데 필요한 모든 로컬 변수가 포함되어 있습니다. 스레드는 자체 스택에만 액세스할 수 있습니다. 지역 변수는 다른 스레드에서는 볼 수 없으며 변수를 생성한 스레드에서만 볼 수 있습니다. 두 스레드가 동일한 코드를 실행하는 상황에서 둘 다 자체 로컬 변수를 생성합니다. 따라서 각 스레드는 각 로컬 변수의 자체 버전을 갖습니다.

기본 유형의 모든 로컬 변수( boolean , byte , short , char , int , long , float , double )는 전적으로 스레드 스택에 저장되며 다른 스레드에서는 볼 수 없습니다. 한 스레드는 기본 변수의 복사본을 다른 스레드에 전달할 수 있지만 기본 지역 변수를 공유할 수는 없습니다.

더미

힙에는 개체를 만든 스레드에 관계없이 응용 프로그램에서 만든 모든 개체가 포함됩니다. 여기에는 기본 유형의 래퍼(예: Byte , Integer , Long 등)가 포함됩니다. 객체가 생성되어 지역 변수에 할당되었는지 또는 다른 객체의 멤버 변수로 생성되었는지는 중요하지 않으며 힙에 저장됩니다.

아래는 객체(힙에 저장됨)뿐만 아니라 호출 스택 및 로컬 변수(스택에 저장됨)를 보여주는 다이어그램입니다.

더미

로컬 변수가 기본 유형인 경우 스레드의 스택에 저장됩니다.

지역 변수는 개체에 대한 참조가 될 수도 있습니다. 이 경우 참조(로컬 변수)는 스레드 스택에 저장되지만 개체 자체는 힙에 저장됩니다.

개체에는 메서드가 포함되며 이러한 메서드에는 지역 변수가 포함됩니다. 메서드를 소유한 개체가 힙에 저장되어 있더라도 이러한 지역 변수는 스레드 스택에도 저장됩니다.

개체의 멤버 변수는 개체 자체와 함께 힙에 저장됩니다. 이는 멤버 변수가 기본 유형일 때와 개체 참조일 때 모두 해당됩니다.

정적 클래스 변수도 클래스 정의와 함께 힙에 저장됩니다.

개체와의 상호 작용

힙의 개체는 해당 개체에 대한 참조가 있는 모든 스레드에서 액세스할 수 있습니다. 스레드가 개체에 액세스할 수 있으면 개체의 변수에 액세스할 수 있습니다. 두 스레드가 동시에 같은 개체에서 메서드를 호출하면 둘 다 개체의 멤버 변수에 액세스할 수 있지만 각 스레드는 고유한 로컬 변수 복사본을 갖게 됩니다.

개체와의 상호 작용(힙)

두 스레드에는 지역 변수 세트가 있습니다.지역 변수 2힙의 공유 객체를 가리킵니다(개체 3). 각 스레드에는 자체 참조가 있는 로컬 변수의 자체 복사본이 있습니다. 해당 참조는 지역 변수이므로 스레드 스택에 저장됩니다. 그러나 두 개의 서로 다른 참조가 힙의 동일한 개체를 가리킵니다.

일반사항이니 참고하세요개체 3에 대한 링크가 있습니다개체 2그리고개체 4멤버 변수로(화살표로 표시). 이 링크를 통해 두 개의 스레드가 액세스할 수 있습니다.개체 2그리고물체4.

다이어그램은 또한 로컬 변수(지역 변수 1methodTwo 에서 ). 각 사본에는 서로 다른 두 개체를 가리키는 서로 다른 참조가 포함되어 있습니다(개체 1그리고개체 5) 같은 것이 아닙니다. 이론적으로 두 스레드는 둘 다 액세스할 수 있습니다.개체 1, 그래서개체 5이 두 개체에 대한 참조가 있는 경우. 그러나 위의 다이어그램에서 각 스레드는 두 개체 중 하나에 대한 참조만 가지고 있습니다.

객체와의 상호 작용의 예

코드에서 작업을 시연하는 방법을 살펴보겠습니다.

public class MySomeRunnable implements Runnable() {

    public void run() {
        one();
    }

    public void one() {
        int localOne = 1;

        Shared localTwo = Shared.instance;

        //... do something with local variables

        two();
    }

    public void two() {
        Integer localOne = 2;

        //... do something with local variables
    }
}
public class Shared {

    // store an instance of our object in a variable

    public static final Shared instance = new Shared();

    // member variables pointing to two objects on the heap

    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);
}

run() 메서드는 one() 메서드를 호출 하고 one() 메서드는 two() 메서드 를 호출합니다 .

one() 메서드는 기본 지역 변수(localOne) 유형의 int 및 지역 변수(localTwo), 개체에 대한 참조입니다.

one() 메서드를 실행하는 각 스레드는 자체 복사본을 생성합니다.localOne그리고localTwo당신의 스택에. 변수localOne서로 완전히 분리되어 각 스레드의 스택에 있습니다. 한 쓰레드는 다른 쓰레드가 자신의 복사본에 어떤 변화를 주는지 볼 수 없습니다.localOne.

one() 메서드를 실행하는 각 스레드는 자체 복사본도 생성합니다.localTwo. 그러나 두 개의 서로 다른 사본localTwo결국 힙의 동일한 객체를 가리키게 됩니다. 사실은localTwo정적 변수가 참조하는 객체를 가리킴사례. 정적 변수의 복사본은 하나만 있으며 해당 복사본은 힙에 저장됩니다.

그래서 두 사본 모두localTwo결국 동일한 Shared 인스턴스를 가리킵니다 . Shared 인스턴스 도 힙에 저장됩니다. 일치합니다개체 3위 다이어그램에서.

Shared 클래스 에는 두 개의 멤버 변수도 포함되어 있습니다. 멤버 변수 자체는 개체와 함께 힙에 저장됩니다. 두 개의 멤버 변수가 다른 두 개체를 가리킴정수. 이러한 정수 개체는 다음에 해당합니다.개체 2그리고개체 4다이어그램에.

또한 two() 메서드는 이름이 지정된 지역 변수를 생성합니다.localOne. 이 지역 변수는 Integer 유형의 객체에 대한 참조입니다 . 메서드는 링크를 설정합니다.localOne새로운 Integer 인스턴스를 가리킵니다 . 링크는 복사본에 저장됩니다.localOne각 스레드에 대해. 두 개의 Integer 인스턴스가 힙에 저장되며 메서드가 실행될 때마다 새로운 Integer 객체를 생성하기 때문에 이 메서드를 실행하는 두 스레드는 별도의 Integer 인스턴스를 생성합니다 . 그들은 일치개체 1그리고개체 5위 다이어그램에서.

기본 유형인 Integer 유형의 Shared 클래스 에 있는 두 개의 멤버 변수도 주목하십시오 . 이러한 변수는 멤버 변수이므로 개체와 함께 힙에 계속 저장됩니다. 스레드 스택에는 로컬 변수만 저장됩니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다