자바 의 메모리 메커니즘 상세 설명

5511 단어 자바메모리
자바 는 메모 리 를 두 가지 로 나 누 었 다.하 나 는 스 택 메모리 이 고 다른 하 나 는 메모리 이다.함수 에서 정 의 된 기본 유형의 변수 와 대상 의 인용 변 수 는 모두 함수 의 스 택 메모리 에서 분 배 됩 니 다.코드 블록 에서 변 수 를 정의 할 때 자바 는 스 택 에서 이 변수 에 메모리 공간 을 분배 합 니 다.변 수 를 초과 한 역할 영역(예 를 들 어 함수 A 에서 함수 B 를 호출 하고 함수 B 에서 변 수 를 정의 합 니 다.변수 a 의 역할 영역 은 함수 B 일 뿐 입 니 다.함수 B 가 실 행 된 후에 변수 a 는 자동 으로 삭 제 됩 니 다.분 배 된 메모리 가 회 수 됩 니 다)자바 는 이 변수 에 분 배 된 메모리 공간 을 자동 으로 방출 합 니 다.이 메모리 공간 은 즉시 다른 용도 로 사용 할 수 있 습 니 다.
메모리 더 미 는 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.전역 코드 영역:모든 방법 정 의 를 저장 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기