메모리 관리 Java

스택 메모리란 무엇입니까?

Java의 스택은 메소드, 지역 변수 및 참조 변수를 포함하는 메모리 섹션입니다. 스택 메모리는 항상 Last-In-First-Out 순서로 참조됩니다. 지역 변수는 스택에 생성됩니다.

힙 메모리란 무엇입니까?

힙은 객체를 포함하고 참조 변수를 포함할 수 있는 메모리 섹션입니다. 인스턴스 변수는 힙에서 생성됩니다.

메모리 할당 Java

메모리 할당 Java 변수와 구조체 및 클래스의 인스턴스를 저장하기 위해 프로그램에서 가상 메모리 섹션을 별도로 설정하는 프로세스입니다. 그러나 선언 시 객체에 메모리가 할당되지 않고 참조만 생성됩니다. 객체의 메모리 할당에는 new() 메소드를 사용하므로 객체에는 항상 힙에 메모리가 할당됩니다.

The Java 메모리 할당은 다음 섹션으로 구분됩니다.

  1. 더미
  2. 스택
  3. 암호
  4. 정적인

효과적인 관리를 위해서는 이러한 메모리 분할이 필요합니다.

  • The 암호 섹션에는 귀하의 바이트 코드.
  • The 스택 메모리 섹션에는 다음이 포함됩니다. 메소드, 지역 변수, 참조 변수.
  • The 더미 섹션에 다음이 포함되어 있습니다. 사물 (참조 변수도 포함될 수 있음)
  • The 정적인 섹션에 다음이 포함되어 있습니다. 정적 데이터/방법.

로컬 변수와 인스턴스 변수의 차이점

인스턴스 변수 선언 클래스 내부에는 있지만 메소드 내부에는 없습니다.

class Student{ 
int num; // num is  instance variable 
public void showData{}

지역 변수 선언된다 내부 a 포함하는 방법 방법 인수.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

스택과 힙의 차이점

LINK 비디오에 접근할 수 없는 경우

이를 더 잘 이해하기 위해 예를 들어 보겠습니다. 메인 메서드가 메서드 m1을 호출한다고 가정해 보겠습니다.

public void m1{
int x=20
}

스택 Java에서는 m1 메소드에서 프레임이 생성됩니다.

Java 스택과 힙

m1의 변수 X는 스택의 m1에 대한 프레임에도 생성됩니다. (아래 이미지 참조).

Java 스택과 힙

메서드 m1이 메서드 m2를 호출하고 있습니다. 스택 java에서는 m2 프레임 위에 m1에 대한 새 프레임이 생성됩니다.

Java 스택과 힙

Java 스택과 힙

변수 b와 c도 스택의 프레임 m2에 생성됩니다.

public void m2(int b){
boolean c;
}

Java 스택과 힙

같은 메서드 m2가 메서드 m3를 호출합니다. 다시 프레임 m3가 스택 맨 위에 생성됩니다(아래 이미지 참조).

Java 스택과 힙

Java 스택과 힙

이제 우리의 메소드 m3이 "Account" 클래스에 대한 객체를 생성한다고 가정해 보겠습니다. 인스턴스 변수 int p와 int q.

Account {
             Int p;
             Int q;
       }

m3 메소드의 코드는 다음과 같습니다.

public void m3(){
	Account ref = new Account();
	// more code
}

new Account() 문은 힙에 계정 개체를 생성합니다.

Java 스택과 힙

참조 변수 "ref"가 스택 java에 생성됩니다.

Java 스택과 힙

할당 연산자 "="는 참조 변수가 힙에 있는 객체를 가리키도록 만듭니다.

Java 스택과 힙

메서드가 실행을 완료하면 제어 흐름은 호출 메서드로 돌아갑니다. 이 경우 메서드 m2입니다.

Java 스택과 힙

m3 메소드의 스택이 플러시됩니다.

Java 스택과 힙

참조 변수는 더 이상 힙의 개체를 가리키지 않으므로 가비지 수집 대상이 됩니다.

Java 스택과 힙

메서드 m2가 실행을 완료하면 스택에서 팝되고 모든 변수가 플러시되어 더 이상 사용할 수 없게 됩니다.

m1 방법도 마찬가지입니다.

결국 제어 흐름은 프로그램의 시작점으로 돌아갑니다. 보통은 "main" 메서드입니다.

Object에 인스턴스 변수로 참조가 있으면 어떻게 되나요?

public static void main(String args[]) {
  A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d;  //more code }

이 경우 참조 변수 “child”는 힙에 생성되며, 이는 아래 다이어그램과 같이 개체를 가리킵니다.

Java 스택과 힙

가비지 컬렉션이란? Java?

쓰레기 수거 Java 프로그램이 자동으로 메모리 관리를 수행하는 프로세스입니다. GC(Garbage Collector)는 사용되지 않는 객체를 찾아서 삭제하여 메모리를 회수합니다. ~ 안에 Java객체의 동적 메모리 할당은 일부 메모리를 사용하는 new 연산자를 사용하여 달성되며, 메모리는 객체를 사용하기 위한 참조가 있을 때까지 할당된 상태로 유지됩니다.

객체에 대한 참조가 없으면 해당 객체는 더 이상 필요하지 않은 것으로 간주되며 객체가 점유하고 있는 메모리를 회수할 수 있습니다. 객체를 명시적으로 파괴할 필요는 없습니다. Java 할당 취소를 자동으로 처리합니다.

이를 달성하는 기술은 다음과 같이 알려져 있습니다. 쓰레기 수거. 메모리 할당을 해제하지 않는 프로그램은 시스템에 할당할 메모리가 남아 있지 않을 때 결국 충돌이 발생할 수 있습니다. 이런 프로그램이 있다고 합니다 메모리 누수. 쓰레기 수거 Java 자동으로 발생 프로그램 수명 동안 메모리 할당을 취소할 필요가 없으므로 메모리 누수를 방지할 수 있습니다.

C 언어에서 free() 함수를 사용하여 동적으로 할당된 메모리를 해제하는 것은 프로그래머의 책임입니다. 이곳은 Java 메모리 관리 리드.

참고 : 모든 객체는 메모리의 Heap Section에서 생성됩니다. 이에 대한 자세한 내용은 다음 튜토리얼에서 설명합니다.

예: 가비지 수집기 메커니즘을 배우려면 Java

단계 1) 다음 코드를 편집기에 복사하세요.

class Student{
int a;
int b;
  public void setData(int c,int d){
    a=c;
    b=d;
  }
  public void showData(){
    System.out.println("Value of a = "+a);
    System.out.println("Value of b = "+b);
  }
  public static void main(String args[]){
    Student s1 = new Student();
    Student s2 = new Student();
    s1.setData(1,2);
    s2.setData(3,4);
    s1.showData();
    s2.showData();
    //Student s3;
    //s3=s2;
    //s3.showData();
    //s2=null;
    //s3.showData();
    //s3=null;
    //s3.showData();
  }
}

단계 2) 코드를 저장하고, 컴파일하고 실행합니다. 그림과 같이 두 개의 객체와 두 개의 참조 변수가 생성됩니다.


 가비지 수집기 메커니즘

단계 3) # 20,21,22 줄의 주석 처리를 해제합니다. 코드를 저장하고, 컴파일하고, 실행하세요.

단계 4) 아래 다이어그램에 표시된 것처럼 두 개의 참조 변수가 동일한 개체를 가리키고 있습니다.

가비지 수집기 메커니즘

단계 5) 23번과 24번 줄의 주석 처리를 해제합니다. 코드를 컴파일, 저장 및 실행합니다.

단계 6) 아래 다이어그램에 표시된 것처럼 s2는 null이 되지만 s3은 여전히 ​​객체를 가리키고 있으며 Java 가비지 수집에 적합하지 않습니다.

 가비지 수집기 메커니즘

단계 7) 25번과 26번 줄의 주석 처리를 해제합니다. 코드를 저장하고, 컴파일하고 실행합니다.

단계 8) 이 시점에서는 객체를 가리키는 참조가 없으며 가비지 수집 대상이 됩니다. 메모리에서 제거되며 다시 검색할 수 있는 방법이 없습니다.

 가비지 컬렉터 배우기

개체를 삭제하는 방법 Java?

1) 개체를 가비지 수집에 적합하게 만들려면 참조 변수를 null로 할당하세요.

2) 기본 유형은 객체가 아닙니다. null을 할당할 수 없습니다.

개체를 삭제하는 방법 Java

슬립폼 공법 선택시 고려사항

  • 메서드가 호출되면 스택 상단에 프레임이 생성됩니다.
  • 메서드 실행이 완료되면 제어 흐름이 호출 메서드로 돌아가고 해당 스택 프레임이 플러시됩니다.
  • 지역 변수는 스택에 생성됩니다.
  • 인스턴스 변수는 힙에 생성되며 해당 변수가 속한 개체의 일부입니다.
  • 참조 변수는 스택에 생성됩니다.

이 게시물을 요약하면 다음과 같습니다.