메모리 관리 Java
스택 메모리란 무엇입니까?
Java의 스택은 메소드, 지역 변수 및 참조 변수를 포함하는 메모리 섹션입니다. 스택 메모리는 항상 Last-In-First-Out 순서로 참조됩니다. 지역 변수는 스택에 생성됩니다.
힙 메모리란 무엇입니까?
힙은 객체를 포함하고 참조 변수를 포함할 수 있는 메모리 섹션입니다. 인스턴스 변수는 힙에서 생성됩니다.
메모리 할당 Java
메모리 할당 Java 변수와 구조체 및 클래스의 인스턴스를 저장하기 위해 프로그램에서 가상 메모리 섹션을 별도로 설정하는 프로세스입니다. 그러나 선언 시 객체에 메모리가 할당되지 않고 참조만 생성됩니다. 객체의 메모리 할당에는 new() 메소드를 사용하므로 객체에는 항상 힙에 메모리가 할당됩니다.
The Java 메모리 할당은 다음 섹션으로 구분됩니다.
- 더미
- 스택
- 암호
- 정적인
효과적인 관리를 위해서는 이러한 메모리 분할이 필요합니다.
- 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 메소드에서 프레임이 생성됩니다.
m1의 변수 X는 스택의 m1에 대한 프레임에도 생성됩니다. (아래 이미지 참조).
메서드 m1이 메서드 m2를 호출하고 있습니다. 스택 java에서는 m2 프레임 위에 m1에 대한 새 프레임이 생성됩니다.
변수 b와 c도 스택의 프레임 m2에 생성됩니다.
public void m2(int b){
boolean c;
}
같은 메서드 m2가 메서드 m3를 호출합니다. 다시 프레임 m3가 스택 맨 위에 생성됩니다(아래 이미지 참조).
이제 우리의 메소드 m3이 "Account" 클래스에 대한 객체를 생성한다고 가정해 보겠습니다. 인스턴스 변수 int p와 int q.
Account {
Int p;
Int q;
}
m3 메소드의 코드는 다음과 같습니다.
public void m3(){
Account ref = new Account();
// more code
}
new Account() 문은 힙에 계정 개체를 생성합니다.
참조 변수 "ref"가 스택 java에 생성됩니다.
할당 연산자 "="는 참조 변수가 힙에 있는 객체를 가리키도록 만듭니다.
메서드가 실행을 완료하면 제어 흐름은 호출 메서드로 돌아갑니다. 이 경우 메서드 m2입니다.
m3 메소드의 스택이 플러시됩니다.
참조 변수는 더 이상 힙의 개체를 가리키지 않으므로 가비지 수집 대상이 됩니다.
메서드 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 프로그램이 자동으로 메모리 관리를 수행하는 프로세스입니다. 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을 할당할 수 없습니다.
슬립폼 공법 선택시 고려사항
- 메서드가 호출되면 스택 상단에 프레임이 생성됩니다.
- 메서드 실행이 완료되면 제어 흐름이 호출 메서드로 돌아가고 해당 스택 프레임이 플러시됩니다.
- 지역 변수는 스택에 생성됩니다.
- 인스턴스 변수는 힙에 생성되며 해당 변수가 속한 개체의 일부입니다.
- 참조 변수는 스택에 생성됩니다.



















