자바 의 메모리 메커니즘 상세 설명
메모리 더 미 는 new 가 만 든 메모리 배열 을 저장 하고 더미 에서 분 배 된 메모리 로 자바 가상 컴퓨터 의 자동 쓰레기 회수 기 에서 관리 합 니 다.더미 에 하나의 배열 이나 대상 이 생 긴 후에 스 택 에서 특수 한 변 수 를 정의 할 수 있 습 니 다.스 택 에 있 는 이 변 수 는 배열 이나 대상 이 메모리 에 있 는 첫 번 째 주소 와 같 습 니 다.스 택 에 있 는 이 변 수 는 배열 이나 대상 의 인용 변수 가 되 었 습 니 다.나중에 프로그램 에서 스 택 에 있 는 변 수 를 사용 하여 더미 에 있 는 배열 이나 대상 에 접근 할 수 있 습 니 다.인용 변 수 는 배열 이나 대상 을 위 한 이름 에 해당 합 니 다.인용 변 수 는 일반적인 변수 입 니 다.정의 할 때 스 택 에서 분 배 됩 니 다.인용 변 수 는 프로그램 이 다른 역할 영역 밖으로 실 행 된 후에 방출 됩 니 다.한편,배열 과 대상 본 성 은 더미 에서 분 배 됩 니 다.new 가 만 든 배열 이나 대상 의 문 구 를 사용 하 는 코드 블록 외 에 도 배열 과 대상 본 성 이 차지 하 는 메모리 가 방출 되 지 않 습 니 다.배열 과 대상 은 인용 변수 가 가리 키 지 않 을 때 쓰레기 로 변 합 니 다.더 이상 사용 할 수 없습니다.그 다음 에 불확실 한 시간 에 쓰레기 회수 기 에 의 해 수 거 됩 니 다(방출).이것 도 자바 가 메모리 에서 차지 하 는 원인 입 니 다.실제로 스 택 의 변 수 는 메모리 의 변 수 를 가리 키 는데 이것 이 자바 의 지침 입 니 다.
코드 인 스 턴 스 데모 1:단일 대상 생 성
class Person {
String name ;
int age ;
public void tell() {
System.out.println(" :"+name+", :"+age);
}
}
public class Demo1 {
public static void main(String[] args) {
Person per = new Person() ;
}
}
상기 프로그램 에서 대상 per 를 예화 시 켰 습 니 다.예화 하 는 과정 에서 메모리 에 공간 을 열 어야 합 니 다.그 중에서 스 택 메모리 와 메모리 가 포함 되 고 구체 적 인 메모리 분 배 는 다음 그림 과 같 습 니 다.그림 1-1 대상 의 실례 화 과정
위의 그림 에서 대상 이름 per 가 스 택 메모리 에 저 장 된 것 을 발견 할 수 있 습 니 다.per 대상 은 실례 화 되 었 을 뿐 구체 적 으로 할당 되 지 않 았 기 때문에 모두 기본 값 입 니 다.문자열 의 기본 값 은 null 이 고 int 형식의 기본 값 은 0 입 니 다.앞에서 언급 했 듯 이 메모리 공간 은 new 키 워드 를 사용 해 야 열 수 있 습 니 다.
코드 인 스 턴 스 데모 2:여러 개체 생 성
class Person {
String name ;
int age ;
public void tell() {
System.out.println(" :"+name+", :"+age);
}
}
public class Demo2 {
public static void main(String[] args) {
Person per1 = new Person() ;
Person per2 = new Person() ;
per1.name=" " ;
per1.age=30 ;
per2.age=33 ;
per1.tell();
per2.tell();
}
}
그림 1-2 두 대상 을 예화 한다.
관건 적 인 개념:클래스 는 배열 과 마찬가지 로 모두 인용 유형 에 속 합 니 다.인용 유형 은 같은 메모리 가 여러 개의 스 택 메모리 에 의 해 가리 킬 수 있다 는 것 을 말 합 니 다.다음은 인용 전달 의 간단 한 인 스 턴 스 를 살 펴 보 겠 습 니 다.
코드 인 스 턴 스 데모 3:대상 참조 전달 1
class Person {
String name ;
int age ;
public void tell() {
System.out.println(" :"+name+", :"+age);
}
}
public class Demo3 {
public static void main(String[] args) {
Person per1 = new Person() ;
Person per2 = per1 ;//------- --------
per1.name=" " ;
per1.age=30 ;
per2.age=33 ;
per1.tell();
per2.tell();
}
}
프로그램 실행 결 과 는:프로그램의 실행 결 과 를 통 해 알 수 있 듯 이 두 대상 이 출력 한 내용 이 똑 같 습 니 다.실제 참조 전달 이란 하나의 메모리 공간의 사용권 을 여러 개의 스 택 메모리 공간 에 맡 기 는 것 입 니 다.모든 스 택 메모리 공간 은 메모리 공간의 내용 을 수정 할 수 있 습 니 다.이 프로그램의 메모리 배분 도 는 다음 과 같 습 니 다.
그림 1-3 대상 이 인용 한 전달 메모리 할당
그림 1-3 대상 이 인용 한 전달 메모리 할당(계속)
메모:상기 실례 에서 대상 per2 는 메모리 공간 이 없습니다.이것 은 대상 per2 가 성명 작업 만 하고 실례 화 작업 도 하지 않 았 기 때 문 입 니 다.new 키 워드 를 사용 하여 예화 한 후에 야 메모리 공간 이 생 길 수 있 습 니 다.
코드 인 스 턴 스 데모 4:대상 참조 전달 2
class Person {
String name ;
int age ;
public void tell() {
System.out.println(" :"+name+", :"+age);
}
}
public class Demo4 {
public static void main(String[] args) {
Person per1 = new Person() ;
Person per2 = new Person() ;
per1.name=" " ;
per1.age=30 ;
per2.name=" " ;
per2.age=33 ;
per2=per1 ;//----- ----
per1.tell();
per2.tell();
}
}
위 실행 프로그램의 결 과 는 다음 과 같 습 니 다.프로그램의 출력 결 과 를 보면 Demo 3 와 차이 가 많 지 않다 는 것 을 알 수 있다.그러나 메모리 분배 에 약간의 변화 가 생 겼 다.구체 적 으로 다음 과 같다.
그림 1-4(쓰레기 대상)의 생 성
주의 점:
1.자바 자체 가 쓰레기 수집 메커니즘(Garbage Collection,GC)을 제공 하고 사용 하지 않 는 메모리 공간 을 비정 기적 으로 방출 합 니 다.대상 이 사용 하지 않 으 면 위 에 쌓 인 메모리 의 name="이사"와 같은 GC 방출 공간 을 기다 립 니 다.age=33。
2.하나의 스 택 메모리 가 하나의 메모리 공간 만 가리 킬 수 있 습 니 다.다른 메모리 공간 을 가리 키 려 면 기 존 지향 을 끊 어야 새로운 지향 을 할당 할 수 있 습 니 다.
자바 에서 흔히 볼 수 있 는 메모리 영역
자바 에는 주로 4 개의 메모리 공간 이 존재 합 니 다.이 메모리 의 이름과 역할 은 다음 과 같 습 니 다.
1.스 택 메모리 공간:모든 대상 의 이름 을 저장 합 니 다.
2.메모리 공간 쌓 기:각 대상 의 구체 적 인 속성 내용 을 저장 합 니 다.
3.전역 데이터 영역:static 형식의 속성 값 을 저장 합 니 다.
4.전역 코드 영역:모든 방법 정 의 를 저장 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.