J2SE 독학 (5) - 자바 메모리 관리

1. 변 수 는 컴퓨터 의 메모리 공간 입 니 다.
2、
자바 메모리 관리 원리 (삼자 관계 인 프로그램 < -- > JVM < -- > 운영 체제):    1) 프로그램 실행 전: 일부 프로 그래 밍 언어 로 작 성 된 프로그램 은 운영 체제 에 직접 메모 리 를 요청 하지만 자바 에 서 는 지원 하지 않 습 니 다.이렇게 하 는 중요 한 장점 중 하 나 는 프로그램의 플랫폼 의 무관 성 을 확보 하 는 것 이다.자바 프로그램 이 메모리 공간 을 만 드 는 것 을 책임 지지 않 는 이상 누가 만 듭 니까?JVM 으로 완 성 됩 니 다.프로그램 이 실행 을 준비 할 때 JVM 에서 운영 체제 에 일정한 메모리 공간 을 미리 요청 하 는 것 을 초기 메모리 공간 이 라 고 합 니 다.프로그램 실행 과정 에서 필요 한 메모 리 는 자바 가상 컴퓨터 가 이 메모리 공간 에서 구분 합 니 다.    2) 프로그램 실행 중: 자바 프로그램 은 자바 가상 컴퓨터 에 메모 리 를 신청 해 왔 습 니 다. 프로그램 에 필요 한 메모리 공간 이 초기 메모리 공간 을 초과 할 때 자바 가상 기 회 는 운영 체제 에 더 많은 메모리 공급 프로그램 을 다시 신청 합 니 다.    3) 메모리 넘 침: 프로그램 이 계속 실 행 됩 니 다. 자바 가상 컴퓨터 가 신청 한 메모리 가 규정된 최대 메모리 공간 에 이 르 렀 을 때 프로그램 은 더 많은 메모리 가 필요 합 니 다. 이 때 메모리 넘 침 오류 가 발생 할 수 있 습 니 다.  이로써 자바 프로그램 이 사용 하 는 메모 리 는 자바 가상 컴퓨터 에 의 해 관리 되 고 분 배 된 것 임 을 알 수 있다.자바 가상 머 신 은 자바 프로그램의 초기 메모리 공간 과 최대 메모리 공간 을 규정 하고 있 습 니 다. 개발 자 는 자바 가상 머 신 이 메모리 공간 을 어떻게 관리 하 는 지 에 만 관심 을 가 져 야 합 니 다. 특정한 운영 체제 가 메모리 를 어떻게 관리 하 는 지 에 관심 을 가지 지 않 아 도 됩 니 다.
3、
메모리 공간 논리 구분: 방법 구역, 쌓 기와 창고 - JVM 은 신청 한 메모 리 를 논리 적 으로 세 개의 구역 으로 나눈다. 즉, 방법 구역, 쌓 기와 창고 이다.

//  class         !

public class Student {

	public String name ;
	
	public int age ;
	 
	public void study() {
		System.out.println("    java!");
	}
}


//  class  stu i    ,  new Student()   
public class Demo {

	public static void main(String[] args) {

		Student stu = new Student() ;
		stu.name = "  " ;
		stu.age = 18 ;
		int i = 10 ;
	}

}

자바 가상 머 신 은 메모리 에 대응 하 는 세 개의 영역 인 '방법 구역', '쌓 기 구역' 과 '스 택 구역' 을 나 누 어 각각 클래스 구조, 대상 의 데이터 와 변수 (기본 형 과 인용 형) 를 저장 합 니 다.이 세 개의 메모리 영역 은 모두 크기 제한 이 있 습 니 다. 모든 영역 에 메모리 가 넘 치면 프로그램 에 오류 가 발생 할 수 있 습 니 다. 스 택 메모리 가 넘 치면 StackOverflow Exception 오류 가 발생 하고 메모리 가 넘 치면 OutOfmory Error 오류 가 발생 할 수 있 습 니 다.1) 방법 구역 의 메모리 배분: 방법 구역 의 기본 최대 용량 은 64M 이 고 자바 가상 기 회 는 불 러 온 자바 류 를 방법 구역 에 저장 하고 클래스 의 구조 (속성 과 방법), 클래스 정적 구성원 등 내용 을 저장 합 니 다.중 소형 프로그램 을 만 들 때 방법 구역 의 메모리 가 넘 치지 않 습 니 다.2) 쌓 아 올 리 는 메모리 할당: 쌓 아 올 리 는 기본 최대 용량 은 64M 이 고 저장 대상 이 가지 고 있 는 데 이 터 를 쌓 는 동시에 원류 에 대한 인용 을 유지 합 니 다.대상 속성 으로 간단하게 이해 할 수 있 는 값 은 더미 에 저장 되 고 대상 이 호출 하 는 방법 은 방법 구역 에 저 장 됩 니 다.3) 스 택 의 메모리 배분: 스 택 의 기본 최대 용량 은 1M 입 니 다. 프로그램 이 실 행 될 때 방법 호출 이 있 을 때마다 자바 가상 기 는 스 택 에서 메모리 하 나 를 스 택 프레임 (Stack frame) 이 라 고 부 릅 니 다. 스 택 프레임 의 메모리 공급 부분 변수 (기본 유형 과 참조 유형 포함) 를 사용 합 니 다. 방법 호출 이 끝 난 후에 자바 가상 기 회 는 이 스 택 프레임 이 사용 하 는 메모 리 를 회수 합 니 다.  또 배열 내부 에 도 지침 이 봉 해 져 있 으 며, 기본 데이터 형식의 배열 이라도 지침 이 봉 해 져 있 으 며, 배열 도 참조 형식 입 니 다.
4、
JAVA 데이터 형식   C 언어 는 포인터 형식의 변 수 를 설명 할 수 있 습 니 다.그럼 자바 에 지침 이 있 냐 고요?당신 은 반드시 명확 하 게 대답 해 야 합 니 다. "JAVA 에는 지침 이 없습니다."문 제 는 여기 서 끝나 지 않 았 습 니 다. 이 어 "하지만 JAVA 밑 에 지침 이 봉인 되 어 있 습 니 다" 라 고 말 해 야 합 니 다.네, 자바 바 텀 에 지침 이 봉인 되 어 있 습 니 다. 그러나 자바 에는 지침 이 없습니다. 즉, 지침 형식의 변 수 를 만 들 수 없습니다.   그러나 모든 유형 이 포인터 로 봉 인 된 것 은 아니다. 이 점 에 따라 자바 의 데이터 형식 은 두 가지 로 나 뉜 다. 즉, 값 형식 (기본 데이터 형식) 과 인용 유형 이다.   1), 분류 원칙: 봉인 여부 에 따라 지침 (분배 공간 형식)   2), 기본 데이터 형식: 값 형식 (기본 데이터 형식 과 기본 메타 데이터 형식 이 라 고도 함) - 스 택 에 만 메모리 (4 가지 8 가지, J2SE 독학 (3) - 자바 문법 기초 (1) 참조)      3), 참조 데이터 형식 (즉, 바 텀 패 키 징 포인터 의 데이터 형식 입 니 다.): 스 택 과 더미 에 각각 하나의 메모 리 를 분배 합 니 다. 예 를 들 어 클래스, 배열, 인터페이스 등 입 니 다. 그들 은 메모리 에 두 개의 공간 을 분배 합 니 다. 첫 번 째 메모 리 는 스 택 에 분배 되 고 다른 메모리 주소 만 저장 하 며 구체 적 인 수 치 를 저장 하지 않 습 니 다. 우 리 는 이것 을 포인터 형식의 변수 라 고 부 릅 니 다. 두 번 째 메모 리 는 쌓 여 있 습 니 다.대상 속성 값 등 구체 적 인 수 치 를 저장 합 니 다.
5、
성명 대상 및 생 성 대상    성명 대상, 포인터 형식 변 수 를 상당히 분배 하고 스 택 에서 메모 리 를 분배 합 니 다.    클래스 는 참조 형식 입 니 다. 성명 대상 은 스 택 에서 포인터 형식 을 설명 하 는 변수 에 해당 합 니 다. 메모리 에는 구체 적 인 수 치 를 저장 하지 않 고 다른 메모리 의 주소 만 저장 합 니 다.    대상 을 만 들 고 구체 적 인 메모리 공간 을 만 들 며 더미 에 메모 리 를 할당 합 니 다.    자바 에 서 는 일반적으로 new 키 워드 를 사용 하여 대상 을 만 듭 니 다 (물론 더 높 은 반사 도 있 습 니 다. new 키 워드 를 사용 하지 않 아 도 됩 니 다) 예 를 들 어:    zhouxing = new Student () 는 창설 대상 이다.이 줄 코드 는 모두 두 가지 일 을 했 습 니 다. 첫 번 째 는 더미 에 학생 들 의 구체 적 인 수 치 를 저장 하 는 메모리 (예 를 들 어 35DF) 를 할당 하 는 것 입 니 다. 두 번 째 는 이 메모리 의 첫 번 째 주 소 를 위 에서 설명 한 지침 변 수 를 부여 하 는 것 입 니 다.    대상 이 생 성 되 어야 사용 할 수 있 습 니 다. 생 성 되 지 않 는 다 고 만 밝 히 면 대상 속성 과 방법 을 호출 할 때 빈 포인터 이상 이 표 시 됩 니 다 (NullPointer Exception)    대상 만 설명 하고 스 택 에 구체 적 인 수 치 를 저장 하지 않 는 메모리 만 할당 하 는 것 과 같 습 니 다.생 성 되 지 않 았 습 니 다. 더미 에 구체 적 인 수 치 를 저장 하 는 메모 리 를 만 들 지 않 았 습 니 다. 속성 방법 을 호출 할 때 시스템 에서 구체 적 인 메모 리 를 찾 지 못 하면 빈 포인터 가 이상 합 니 다.빈 포인터 이상 은 메모리 가 가리 키 지 않 아 생 긴 것 이 라 고 거꾸로 말 할 수 있다.
6. JAVA 값 전송 참여 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조 참조
   값 에 따라 전달 매개 변수 수치 가 변 하지 않 고 참조 전달 매개 변수 수치 에 따라 변 합 니 다.
   자바 의 데이터 형식 에 있어 기본 데이터 형식 은 값 에 따라 전달 되 며 값 형식 이 라 고도 부 르 며 인용 유형 은 인용 에 따라 전달 된다.예:

   public class TestValueAndRef { 
  /** 
   *         
   * @param pa           
   * @param pstu            
   * @param parr         
   */ 
  void change(int pa, Student pstu, int[] parr) { 
     
    //         pa   
    pa = pa + 10; 
    //          stu,parr  
    pstu.stuAge = pstu.stuAge + 10; 
    parr[0] = parr[0] + 10; 
     
    System.out.println("      pa = " + pa); 
    System.out.println("      pstu.stuAge = " + pstu.stuAge); 
    System.out.println("      parr[0] = " + parr[0]); 
  } 
 
} 

실행 클래스:

public class Test { 
  public static void main(String[] args) { 
     
    Student student = new Student(); 
    student.stuAge = 10; 
    int a = 10; 
    int arr[] = new int[]{9, 5, 27}; 
     
    System.out.println("    a = " + a); 
    System.out.println("    student.stuAge = " +  
student.stuAge); 
    System.out.println("    arr[0] = " + arr[0]); 
     
    TestValueAndRef testValueAndRef = new TestValueAndRef(); 
    testValueAndRef.change(a, student, arr); 
     
    System.out.println("      a = " + a); 
    System.out.println("      student.stuAge = " +  
student.stuAge); 
    System.out.println("      arr[0] = " + arr[0]); 
 
  } 
} 

실행 결과:
초기 값 a = 10
초기 값 student. stuAge = 10
초기 값 arr [0] = 9
방법 체 변경 후 pa = 20
방법 체 변경 후 pstu. stuAge = 20
방법 체 변경 후 parr [0] = 19
함수 호출 후 a = 10
함수 호출 후 student. stuAge = 20
함수 호출 후 arr [0] = 19
우 리 는 기본 데이터 형식 int 변수 a 가 방법 체 에서 수 치 를 바 꾸 었 지만 방법 이 호출 된 후에 원시 수 치 는 변 하지 않 았 음 을 보 았 다.한편, 인용 데이터 형식 Student 는 방법론 에서 나이 의 수 치 를 바 꾸 고 방법 이 실 행 된 후에 수치 가 바 뀌 었 으 며 배열 도 인용 유형 이기 때문에 그 값 도 바 뀌 었 다.즉, 값 유형 은 값 에 따라 매개 변 수 를 전달 하고 방법 호출 이 끝 난 후에 원시 수 치 는 변 하지 않 으 며 인용 유형 은 인용 전달 매개 변수 방법 에 따라 호출 이 끝 난 후에 원시 수 치 는 변 한다.값 에 따라 전달 하 든 인용 에 따라 전달 하 든 모두 스 택 에 있 는 데 이 터 를 매개 변수 변 수 를 백업 한 것 입 니 다. 값 형식 에 따라 구체 적 인 수 치 를 백업 할 뿐 형식 을 참조 하여 메모리 주 소 를 백업 합 니 다. 그래서 이런 측면 에서 볼 때 자바 는 모두 값 에 따라 전 송 된 것 이 라 고 할 수 있 습 니 다. 왜냐하면 이것 은 모두 데 이 터 를 백업 한 것 이기 때 문 입 니 다.
7. String 클래스
  
특례 String 형식 은 인용 형식 이지 만 인용 전 참 을 사용 하면 원본 수 치 는 변 하지 않 습 니 다.

   public class TestString { 
   public static void main(String[] args) { 
     
    String name = "zhangsan"; 
    TestString testString = new TestString(); 
     
    System.out.println("     :" + name); 
    testString.change(name); 
    System.out.println("     :" + name); 
  } 
   
  void change(String str) { 
    str = "  "; 
    System.out.println("        :" + str); 
  } 
} 

실행 결과:
방법 호출 전: zhangsan
방법 체 내 수정 치 후: 장삼
방법 호출 후: zhangsan
매개 변수 String 은 데이터 형식 을 참조 하지만 그 값 은 변 하지 않 았 습 니 다. 이것 은 String 류 가 final 이 고 길이 가 정 해 져 있 기 때 문 입 니 다.방법 체 내 에서 변 한 것 은 단지 str 의 인용 을 바 꾸 었 을 뿐이다!방법 체 외 name 에는 아무런 영향 이 없습니다!
앞으로 비슷 한 문제 에 부 딪 히 면 '생각 을 많이 하고 그림 을 많이 그리고 실천 을 많이 해 야 한다!'

좋은 웹페이지 즐겨찾기