JVM 변수 저장 위치 [예약]

1. 등록 요구의 할당에있어서, 컴파일러에 의해 수행 빠른 기억 영역, 우리는 프로그램에서 제어 할 수있다.
2 스택 : 스택 프레임 생성 방법에있어서 수행되고, 가변 데이터가 참조하는 객체 기본 유형을 저장하지만, 객체 때 그 자체가 스택에 저장되지 않고, 스택 (밖으로 새 개체의) 또는 상수 풀에 저장됩니다 (상수 문자열 상수 풀에 저장 객체.)
3. 스택 : 모든 새로운 객체를 저장합니다.
4. 정적 필드 (방법 지역) : 고정 부재 (고정 정의) 저장
상수 풀 (방법 영역) : 문자열 상수와 상수 (최종 공용 static)의 기본 타입을 저장하는 단계를 포함한다.
6. 비 RAM 저장 : 영구적 인 하드 디스크 저장 공간이


우리의 주요 관심사 스택, 힙 및 일정 수영장, 객체 스택이 힙의 개체에 대한 상수 풀을 공유 할 수있는 공유 할 수 없습니다. 데이터 크기 및 수명주기 스택은 데이터에 대한 참조가없는 경우, 데이터가 사라집니다, 확실히이다. 힙 객체는 가비지 컬렉터에 대한 책임이며, 따라서 많은 유연성과 크기와 수명주기를 결정할 필요가 없습니다.
문자열의 : 이미 작성된 컴파일 상수 풀에 저장된다 (따옴표하여 정의 된) 경우가 결정될 수있다 (새로운 아웃)에서 실행중인 경우 그 객체에 대한 레퍼런스가 스택에 저장된 힙에 저장됩니다. 문자열은 항상에만 일정한 풀 동일 같음, 힙의 여러 복사본은 들어.
다음 코드로 :

  1.  
    문자열 S1 = "중국";
  2.  
    문자열 S2 = "중국";
  3.  
    문자열 S3 = "중국";
  4.  
    문자열 SS1은 = 새 문자열 ( "중국을");
  5.  
    문자열 SS2는 = 새로운 String ( "중국을");
  6.  
    문자열 SS3는 = 새로운 String ( "중국을");

 

다음은 문자열의 생성이 세 노란색 화살표를 설명하기 위해왔다 "중국"객체가 아닌 경우에하는 상수 풀에 하나를 생성 한 상수 풀에 가서 새로운 모습을 통해 ( "중국"로 가정) 이 문자열 객체는 다음이 힙이 상수 풀의 "중국"개체 개체를 복사 다시 만듭니다. 이 얼굴 질문에 적절한 방법 : 문자열의 = 새 문자열 ( " XYZ")는, 생산하고 여러 개체? 그들은 더 "XYZ"상수 풀을 가지고하지 않는 경우 하나 또는 두 개의이다.

변수와 상수 기준의 종류가 스택 상수 풀에 저장 상수 및 변수 참조를 저장.

다음 코드로 :

  1.  
    INT I1 = 9;
  2.  
    INT I2 = 9;
  3.  
    INT I3 = 9;
  4.  
    공용 정적 최종 INT의 INT1 = 9;
  5.  
    공용 정적 최종 INT의 INT2 = 9;
  6.  
    공용 정적 최종 INT의 INT3 = 9;

멤버 변수와 로컬 변수 : 내부 멤버 변수 외부 방법 클래스 변수를 정의된다 로컬 변수 방법 또는 블록 문 변수 내에 정의된다. 지역 변수는 초기화해야합니다.
가 파라미터는 로컬 변수 스택 메모리에 데이터를 로컬 변수이다. 로컬 변수 스택 메모리 소멸 법으로 사라진다.
멤버 변수는 가비지 컬렉터에 의해 재활용에 대한 책임, 객체 힙 내부에 저장됩니다.

다음 코드로 :

패키지 com.study.stackheap;

/ ** 
 * @author의 MDL
 * @date 2019년 11월 15일
 * / 
공용  클래스 생년월일 {
     개인  INT의 일;  
    개인  INT 달;  
    개인  INT 년;      
    공개 생년월일 ( INT의 D, INT m, INT의 Y) {   = D;   
        개월 = m;   
        연도 = Y;  
    }
    / ** 
     * @return * / 
    공공  INT getDay () {
         반환 일;
    }
    / ** 
     * @param의 일 세트의 일
      * / 
    공용  공극 setDay ( INT 일) {
          .day = 일;
    }
    / ** 
     * @return * / 
    공공  INT 속하는 getMonth () {
         반환 달;
    }
    / ** 
     * @param의 개월 세트 월
      * / 
    공용  공극 하여 setMonth ( INT 개월) {
          .month = 개월;
    }
    / ** 
     * @return * / 
    공공  INT getYear는 () {
         반환 년;
    }
    / ** 
     * @param의 해 집합 해
      * / 
    공용  공극 setYear ( INT 년) {
          .year = 년;
    }  
    
    
}
패키지 com.study.stackheap;

/ ** 
 * @author의 MDL
 * @date 2019년 11월 15일
 * https://blog.csdn.net/qq_34467922/article/details/80790443 
 * /

공용  클래스 테스트 {
     공공  정적  무효 메인 (문자열 인수 []) {
         INT의 기간 = 9 ;
        시험 시험 = 새로운 테스트 ();
        test.change (날짜);
        생년월일 D1 = 새로운 생년월일 (7, 7, 1970 );
        에서 System.out.println ( "날짜 ---"+ 날짜);
    }

    공개  공극 변화 ( int로 Ⅰ) { 1234 = ;
    }
}

 

 

상기 코드는, 로컬 변수 i는, (D)는, m은 Y가 멤버 변수와 로컬 변수, 년, 월, 일에 대한 파라미터이다 올라간다. 다음 코드 실행 시간 변화를 분석 :
1. 주요 방법은 시작 : DATE = INT (9)].
DATE 로컬 변수 기반 형 및 기준값 스택에 존재한다.
테스트 테스트는 새로운 신규 = 시험 2 ()
테스트 객체 참조 스택 오브젝트 (새로운 테스트 ())의 존재 유무 힙.
3. Test.change (DATE)는,
I는 지역 변수, 기준 값이 존재하고, 스택이다. 상기 방법의 변경의 구현의 완료 후, 스택에서 사라진다.
D1 = 생년월일 생년월일 새로운 새로운 4 (7,7,1970)  
D1 오브젝트 참조 스택 오브젝트 (새 생년월일 ()) 스택에 존재하는 것이다 본 여기서 d, m, 스택에 저장된 로컬 변수 y 및 데이터는 스택에 저장되어 있으므로, 그 종류에 따라 입력. 일, 월, 멤버 변수로 해, 그들은 힙 (새 생년월일 () 내부)에 저장됩니다. 생성자 생년월일이 실행 된 후, (D)는, m은 Y가 스택에서 사라진다.
5.main 완전한 실행에있어서, 날짜 변수, 테스트 스택에서 D1 참조 사라지고, 새로운 테스트 (), 새로운 생년월일 후 () 가비지 콜렉션을 기다릴 것이다.

 

추천

출처www.cnblogs.com/bloodthirsty/p/11981017.html