1. 등록 요구의 할당에있어서, 컴파일러에 의해 수행 빠른 기억 영역, 우리는 프로그램에서 제어 할 수있다.
2 스택 : 스택 프레임 생성 방법에있어서 수행되고, 가변 데이터가 참조하는 객체 기본 유형을 저장하지만, 객체 때 그 자체가 스택에 저장되지 않고, 스택 (밖으로 새 개체의) 또는 상수 풀에 저장됩니다 (상수 문자열 상수 풀에 저장 객체.)
3. 스택 : 모든 새로운 객체를 저장합니다.
4. 정적 필드 (방법 지역) : 고정 부재 (고정 정의) 저장
상수 풀 (방법 영역) : 문자열 상수와 상수 (최종 공용 static)의 기본 타입을 저장하는 단계를 포함한다.
6. 비 RAM 저장 : 영구적 인 하드 디스크 저장 공간이
우리의 주요 관심사 스택, 힙 및 일정 수영장, 객체 스택이 힙의 개체에 대한 상수 풀을 공유 할 수있는 공유 할 수 없습니다. 데이터 크기 및 수명주기 스택은 데이터에 대한 참조가없는 경우, 데이터가 사라집니다, 확실히이다. 힙 객체는 가비지 컬렉터에 대한 책임이며, 따라서 많은 유연성과 크기와 수명주기를 결정할 필요가 없습니다.
문자열의 : 이미 작성된 컴파일 상수 풀에 저장된다 (따옴표하여 정의 된) 경우가 결정될 수있다 (새로운 아웃)에서 실행중인 경우 그 객체에 대한 레퍼런스가 스택에 저장된 힙에 저장됩니다. 문자열은 항상에만 일정한 풀 동일 같음, 힙의 여러 복사본은 들어.
다음 코드로 :
-
문자열 S1 = "중국";
-
문자열 S2 = "중국";
-
문자열 S3 = "중국";
-
문자열 SS1은 = 새 문자열 ( "중국을");
-
문자열 SS2는 = 새로운 String ( "중국을");
-
문자열 SS3는 = 새로운 String ( "중국을");
다음은 문자열의 생성이 세 노란색 화살표를 설명하기 위해왔다 "중국"객체가 아닌 경우에하는 상수 풀에 하나를 생성 한 상수 풀에 가서 새로운 모습을 통해 ( "중국"로 가정) 이 문자열 객체는 다음이 힙이 상수 풀의 "중국"개체 개체를 복사 다시 만듭니다. 이 얼굴 질문에 적절한 방법 : 문자열의 = 새 문자열 ( " XYZ")는, 생산하고 여러 개체? 그들은 더 "XYZ"상수 풀을 가지고하지 않는 경우 하나 또는 두 개의이다.
변수와 상수 기준의 종류가 스택 상수 풀에 저장 상수 및 변수 참조를 저장.
다음 코드로 :
-
INT I1 = 9;
-
INT I2 = 9;
-
INT I3 = 9;
-
공용 정적 최종 INT의 INT1 = 9;
-
공용 정적 최종 INT의 INT2 = 9;
-
공용 정적 최종 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 참조 사라지고, 새로운 테스트 (), 새로운 생년월일 후 () 가비지 콜렉션을 기다릴 것이다.